Как выглядит утечка памяти в JConsole?

Я пытаюсь использовать JConsole, чтобы узнать, есть утечка памяти, но вы не знаете, что искать. Если бы мне пришлось угадывать, использование памяти всегда должно увеличиваться, несмотря на сборку мусора, например:

введите здесь описание изображения

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

введите здесь описание изображения

Как «выглядит» утечка памяти в Java в JConsole?


person gwg    schedule 22.09.2015    source источник
comment
Это действительно зависит от многих вещей, особенно от того, какой сборщик мусора вы выбрали, но я обычно обращаю внимание на тот факт, что со временем использование кучи продолжает расти. Итак, во втором дудле самая нижняя точка впадины постепенно ползет вверх.   -  person Roddy of the Frozen Peas    schedule 22.09.2015
comment
@RoddyoftheFrozenPeas, и я думаю, насколько быстро он ползет вверх, зависит от типа утечки.   -  person gwg    schedule 22.09.2015
comment
После каждого полного сбора используемая сумма продолжает расти. Хотя это может означать, что вам просто нужно больше памяти, чем вашей программе, и если вы дадите ей больше, она выйдет из строя.   -  person Peter Lawrey    schedule 22.09.2015


Ответы (1)


Я думаю, что лучший способ узнать, как выглядит утечка памяти, — это провести эксперимент. Попробуйте что-то вроде этого, чтобы создать утечку памяти:

    Collection<Object> data = new LinkedList<>();
    while(true) {
        long[] canBeGarbageCollected = new long[10000];
        long[] canNotBeGarbageCollected = new long[100];
        data.add(Arrays.asList(canNotBeGarbageCollected));
    }

Помимо JConsole, у вас также есть VisualVM с хорошим плагином под названием «Visual GC». Java Mission Control с записью полета может дать вам много деталей. В командной строке также существует очень мощный инструмент:

jstat -gcutil -h20 $PID 1000

Это покажет, что утечка памяти в конечном итоге приведет к 100% использованию старого пространства (O), и ЦП будет тратить все больше и больше времени на полную сборку мусора (FGCT).

person Martin Claesson    schedule 22.09.2015