内存泄漏Springboot

时间:2017-10-24 02:14:16

标签: 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(我知道)这样做,所以我得到了persistance对象并使用它来截断表格。

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

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

1 个答案:

答案 0 :(得分:3)

非常感谢评论中的所有建议。正如你可能已经猜到的那样,这是我第一次处理内存问题,而且由于它在生产中发生,我有点惊慌失措。

所以真正的问题不是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
  5. 这就是我认为我现在好了。

    感谢所有人的帮助。