我的应用程序似乎使用了太多内存。一段时间以来,我一直在努力寻找来源。但仍然没有运气。
我读过几篇文章指出 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
- 正方体
我是这样解决问题的:
- 教育。到那里去了解一下这个问题以及如何解决它。以下是我使用的几个链接:
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 - 利用新知识绘制一些图表,了解您的内存情况。相信我,这次探索揭示了一大堆我不知道正在发生的事情。 (比如一些汉字数组,我猜 Tesseract 需要它来进行 OCR)
- 然后在执行 jar 时使用
-Xms256m -Xmx512m
,这样您就可以缩小范围,看看应该责备谁。它还会限制服务器中的资源。 - 所有这些让我想到了两个可能导致泄漏和一般问题的原因。
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/