有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java 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分钟内堆积 heap over 30 minutes 下面我提供了一些日志消息的示例(每个日志消息都是在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)

我不太清楚接下来该怎么办


共 (0) 个答案