Проблемы с кучей JVM - PullRequest
       62

Проблемы с кучей JVM

0 голосов
/ 07 октября 2019

Я немного изучаю настройки проекта, которые я использую в работе.

Я заметил, что довольно много приложений, похоже, имеют проблемы с утечкой памяти / кучей. Я заметил, что когда я запускаю приложение, кажется, что оно скачет с 1% кучи, использованной до 20% в течение первых 15 минут, затем оно начнет выравниваться и последовательно использовать только около 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;
}

Это пример приложения, которое я создал, чтобы просто сохранять объекты в базе данных MySQL, используя spring, hibernate и JPA.

/** {@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)

Я не совсем уверен, гдеидти отсюда?

...