Java 内存泄漏Springboot

Java 内存泄漏Springboot,java,spring,hibernate,jpa,Java,Spring,Hibernate,Jpa,我有一个应用程序似乎占用了太多内存。我一直在努力寻找源头有一段时间了。但还是没有运气 我读过几篇文章,指出JPA是SpringBoot内存问题的罪魁祸首。我只有一个存储库,所以我无法想象这是一个问题 @Repository public interface WordRepository extends JpaRepository<Word, Long> { @Query("SELECT w FROM Word w WHERE w.value IN (:words)")

我有一个应用程序似乎占用了太多内存。我一直在努力寻找源头有一段时间了。但还是没有运气

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

@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);
}
我在这里使用它们

@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
    }
}

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

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

所以真正的问题不是JPA。这更像是问题和问题的结合。正如一些评论所暗示的那样,我的记忆问题要归咎于好几个候选人:

  • JPA
  • 提卡
  • Opencv
  • 特塞拉特
我就是这样解决我的问题的:

  • 教育。走出去,了解一下这个问题以及如何解决它。以下是我使用的几个链接:


  • 运用新知识,画一些图表,了解你的记忆状况。相信我,这次探险揭示了一大堆我不知道正在发生的事情。(就像一些汉字数组一样,我猜Tesseract需要它来进行OCR)


  • 然后在执行jar时使用
    -Xms256m-Xmx512m
    ,这样您就可以缩小范围,看看该怪谁。它还将限制服务器中的资源
  • 所有这些都导致了泄漏和故障的两个可能原因。
    1)
    (二)
  • 就这样,我想我现在没事了


    谢谢大家的帮助。

    你有什么问题吗?你的代码会占用大量内存吗?为什么不在盲目猜测之前使用一些分析工具呢?我想你的项目除了jpa还有很多其他功能。对于内存问题,您的猜测可能是正确的,但请使用分析工具查找确切的负责对象。猜测n个无效的假设可以节省时间。从数据库加载大量数据“JPA”怎么可能是内存泄漏的罪魁祸首?这是一系列的接口!如果你打算声称内存泄漏,请至少提供内存转储请记住:大量内存使用不一定是内存泄漏!为了追踪它们中的任何一个,您绝对必须使用内存分析器,这是一个很好的工具,并且可能在99%的时间内都可以使用。拥有某种类型的自动化来“锻炼”您的应用程序(例如用于web应用的JMeter)也是非常宝贵的。它有助于揭示泄漏和其他内存问题,并证明您已经纠正了它们。
    @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
        }
    }