Java - Как найти причину утечки памяти с помощью Jmap - PullRequest
0 голосов
/ 25 июня 2018

Мое java-приложение столкнулось с серьезными утечками памяти. Максимальный размер кучи составляет 8 ГБ. Использование памяти продолжает расти, и полный сбор данных выполняется очень часто. Однако OOM не выбрасывается.


     num     #instances         #bytes  class name
    ----------------------------------------------
       1:        230903     6884999664  [Ljava.lang.Object;
       2:        329559      343492320  [B

A jmap -histo показывает мне, что 230К объектов [] в общей сложности использовали 7G памяти. Как я могу узнать содержимое Object[] или место, где происходят утечки памяти?

1 Ответ

0 голосов
/ 25 июня 2018

Я решил эту проблему с помощью внутреннего инструмента профилирования.Извините, что не могу поделиться этим инструментом с общественностью.Комментарии к этому вопросу очень полезны.

Я суммировал комментарии ниже:

1) Возьмите дамп кучи и проанализируйте его с помощью MAT

2) Используйте профилировщик распределенияНапример, Mission Control или async-profiler

3) Используйте VisualVM для анализа дампа кучи или используйте Mission Control для записи распределений.Примечание: если вы уменьшите размер TLAB, вы получите больше мелких образцов.

4) КСТАТИ Object[] с большей вероятностью выделяются в ArrayList.Дайте им большой средний размер. Я подозреваю, что ваши ArrayList динамически растут (и имеют большой размер ~ 7,5 Кбайт). Это приводит к тому, что они помещаются в постоянное пространство, что затрудняет их очистку.

Фактически оказывается, что утечкавызвано локальным потоком ArrayDeque s, каждый из которых продолжает увеличивать свой размер без надлежащей очистки.

Как указывает @PeterLawrey, большое значение Object[] может указывать на рост ArrayList или ArrayDeque или что-то в этом роде.Этот совет очень полезен.Еще раз спасибо!

...