首页 > 解决方案 > JVM 堆问题

问题描述

我正在对我在工作中使用的项目设置进行一些研究。

我注意到不少应用程序似乎存在内存泄漏/堆问题。我注意到,当我启动一个应用程序时,前 15 分钟它似乎从 1% 的堆使用量跃升至 20%,然后它将开始趋于平稳并始终只使用大约 1%。

public void testPersist() {

    while (true) {

        List<TestModel> testModels = createTestModels();
        testModelManager.save(testModels);      
        testModels = null;

        ApplicationPerformanceSampler.sampleMemory();
    }
}

/**
 * @return
 */
private List<TestModel> createTestModels() {
    List<TestModel> testModels = new ArrayList<>();
    for (int i = 0; i < 5000; i++) {
        TestModel testModel = new TestModel();
        testModel.setTestString("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789");
        testModels.add(testModel);
    }

    return testModels;
}

这是我使用 spring、hibernate 和 JPA 将对象持久保存到 MySQL 数据库的示例应用程序。

/** {@inheritDoc} */
@Override
public void save(final T model) {
    LOG.debug("save model={}", model);
    em.persist(model);

    LOG.debug("model saved. id={}", model.getId());
}

我写了一个小类来采样内存,因为我最初认为内存占用会随着它的持续而变大。

 public static void sampleMemory() {

        Runtime runtime = Runtime.getRuntime();

        long maximumAllocatedMemory = runtime.maxMemory();
        long allocatedMemory = runtime.totalMemory() - runtime.freeMemory();
        long freeMemory = maximumAllocatedMemory - allocatedMemory;

        Double freeMemoryDouble = Double.valueOf(freeMemory);
        Double maximumAllocatedMemroryDouble = Double.valueOf(maximumAllocatedMemory);
        Double percentageFreeMemory = freeMemoryDouble / maximumAllocatedMemroryDouble * 100;

        ApplicationPerformanceStatus appStatus = determineAppStatus(percentageFreeMemory);

        Double usedHeap = 100 - percentageFreeMemory;
        LOG.info("usedHeap={}%, freeHeap={}%, appStatus={}", format(usedHeap), format(percentageFreeMemory),
                appStatus.getText());
}

但是,当我附加 visualVM 时,我看到了以下内容?
堆超过 30 分钟 堆超过 30 分钟 下面我包含了一些日志消息的示例(每条记录在 5000 条记录后被持久化。我已经看到并放入日志中,我知道已经进行了垃圾收集。

2019-10-02 10:58:37.035 INFO  [main] (ApplicationPerformanceSampler.java:52) - usedHeap=9.14%, freeHeap=90.86%, appStatus=OK
2019-10-02 10:58:38.933 INFO  [main] (ApplicationPerformanceSampler.java:52) - usedHeap=9.96%, freeHeap=90.04%, appStatus=OK
2019-10-02 10:58:40.226 INFO  [main] (ApplicationPerformanceSampler.java:52) - usedHeap=10.92%, freeHeap=89.08%, appStatus=OK
2019-10-02 10:58:41.616 INFO  [main] (ApplicationPerformanceSampler.java:52) - usedHeap=4.02%, freeHeap=95.98%, appStatus=OK
(Garbage collection)
2019-10-02 10:58:42.878 INFO  [main] (ApplicationPerformanceSampler.java:52) - usedHeap=5.06%, freeHeap=94.94%, appStatus=OK
2019-10-02 10:58:44.215 INFO  [main] (ApplicationPerformanceSampler.java:52) - usedHeap=5.96%, freeHeap=94.04%, appStatus=OK
2019-10-02 10:58:45.576 INFO  [main] (ApplicationPerformanceSampler.java:52) - usedHeap=7.0%, freeHeap=93.0%, appStatus=OK
2019-10-02 10:58:47.001 INFO  [main] (ApplicationPerformanceSampler.java:52) - usedHeap=8.04%, freeHeap=91.96%, appStatus=OK
2019-10-02 10:58:48.333 INFO  [main] (ApplicationPerformanceSampler.java:52) - usedHeap=9.09%, freeHeap=90.91%, appStatus=OK
2019-10-02 10:58:49.651 INFO  [main] (ApplicationPerformanceSampler.java:52) - usedHeap=10.28%, freeHeap=89.72%, appStatus=OK
(Garbage collection)

我不太确定从这里去哪里?

标签: javahibernatejpajvmheap-memory

解决方案


推荐阅读