java - 内存泄漏 Spring Boot

标签 java spring hibernate jpa

我的应用程序似乎使用了太多内存。一段时间以来,我一直在努力寻找来源。但仍然没有运气。

我读过几篇文章指出 JPA 是 Spring Boot 某些内存问题的罪魁祸首。我只有一个存储库,所以我无法想象这是问题所在。

@Repository
public interface  WordRepository extends JpaRepository<Word, Long> {

    @Query("SELECT w FROM Word w WHERE w.value IN (:words)")
    List<Word> findAllIn(@Param("words") List<String> words);

    Word findFirstByValue(String value);

    @Transactional
    Long removeByValue(String value);

    Page<Word> findAllByCategory(Pageable pageable, String category);
}

我有另一个类是删除表的助手。我无法使用 JPA(据我所知)做到这一点,因此我获取了持久性对象并使用它来截断表。

@Service
public class WordRepositoryHelper {

    @PersistenceContext(unitName = "default")
    private EntityManager entityManager;

    @Transactional
    public int truncateWordTable() {
        final String sql = "truncate table word";
        entityManager.createNativeQuery(sql).executeUpdate();
        return 1;
    }
}

我在这里使用它们。

@Service
@SuppressWarnings("deprecation")
public class CSVResourceService implements ResourceService {

    @Autowired
    private WordRepository wordRepository;

    @Autowired
    private WordRepositoryHelper wordRepositoryHelper;

    private static final String HEADER_ID = "id";
    private static final String HEADER_VALUE = "value";
    private static final String HEADER_CATEGORY = "category";

    @Override
    public Boolean save(MultipartFile file, Boolean replace) throws Exception {

        // some other code

        if (replace) {
            wordRepositoryHelper.truncateWordTable();
        }

        //some other code
    }
}

关于问题或建议的任何指导。

最佳答案

非常感谢评论中的所有建议。正如您可能已经猜到的那样,这是我第一次处理内存问题,因为它是在生产中发生的,所以我有点 panic 。

所以真正的问题不在于 JPA。它更像是问题和问题的组合。就像一些评论表明我有很多候选人应该为我的内存问题负责:

  • JPA
  • 蒂卡
  • Opencv
  • 正方体

我是这样解决问题的:

  1. 教育。到那里去了解一下这个问题以及如何解决它。以下是我使用的几个链接:
    https://www.toptal.com/java/hunting-memory-leaks-in-java
    https://developers.redhat.com/blog/2014/08/14/find-fix-memory-leaks-java-application/
    https://app.pluralsight.com/player?course=java-understanding-solving-memory-problems
  2. 利用新知识绘制一些图表,了解您的内存情况。相信我,这次探索揭示了一大堆我不知道正在发生的事情。 (比如一些汉字数组,我猜 Tesseract 需要它来进行 OCR)
    enter image description here
    enter image description here
  3. 然后在执行 jar 时使用 -Xms256m -Xmx512m,这样您就可以缩小范围,看看应该责备谁。它还会限制服务器中的资源。
  4. 所有这些让我想到了两个可能导致泄漏和一般问题的原因。 1) Using POI or Tika to extract text, stream-to-stream without loading the entire file in memory
    2) Memory Leak from iterating Opencv frames

就是这样,我想我现在没事了。

感谢大家的帮助。

关于java - 内存泄漏 Spring Boot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46901166/

相关文章:

java - Jackson 多态反序列化为特定子类型失败,错误代码为 "InvalidTypeIdException"

java - Teiid 可以像 RDBMS 一样使用 VIEW 吗?

java - spring-session是否用HttpSession保存bean?

java - Hibernate查询没有返回正确的结果

Grails Controller 的 Java 时间转换

java - 在 NetBeans 中添加默认包的类

java - Spring Controller 初始化方法

Spring MVC 将 jsp 作为文本/纯内容类型返回

java - 将字符串日期转换为 yyyy-MM-dd 格式以传入 hibernate 条件

java - 具有自动增量的主/详细信息关系。是否可以立即坚持它们?