Какой режим (выборочный / инструментальный) в профилировщике памяти мне следует использовать, чтобы быть уверенным, что я избавился от утечки памяти в Java? - PullRequest
1 голос
/ 06 августа 2020

В моем приложении Java произошла утечка памяти, которую я пытаюсь устранить. Однако в зависимости от того, какой режим я выберу во время выполнения профилирования, я получаю противоположные результаты. Следовательно, я не уверен, что утечка памяти, на которую я нацелился, была устранена, поскольку, кроме того, в производстве недавно возникла «Ошибка нехватки памяти: Java Heap Space».

Код Visual Studio содержит руководство по поймите разницу между двумя режимами (Sampling / Instrumentation или Tracing Profiler , а также это руководство Ninjas о том же самом топе c на VisualVM . Я понимаю, что с инструментальным режимом накладные расходы намного выше. Но этот режим требуется (по крайней мере, в профилировщике Netbeans), чтобы получить список объектов, которые имеют наибольшее количество «выживших поколений», что является индикатором, за которым следует следить, чтобы увидеть эффективность контрмер это борьба с утечкой памяти.

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

Мой модуль тест начинается с @RunWith(JfxTestRunner.class), чтобы избежать ошибок, связанных с "ошибками инициализации инструментария", когда hing отправляется в поток приложения Java Fx (ie, когда что-то отображается пользователю в приложении GUI).

Теперь, если я запускаю этот модульный тест (l oop, который читает содержимое индекса Solr и заполняет список на основе этого содержимого) и профилируйте его в режиме выборки, я получаю следующий график:

Memory shape in sampled profile Objects in memory in sampled profile

This makes me think the problem is solved since the heap used increases during the index reading and decreases afterwards.

But now if I run the very same test in Instrumented mode with all classes (see "*" below), I get a very different memory shape :

Memory shape in instrumented profile Объекты в памяти в инструментированном профиле

На этот раз используемая куча продолжает увеличиваться с течением времени, как если бы все еще была утечка памяти.

Сначала я использовал инструментальный режим, чтобы получить объекты, которые сохраняли уцелевший мусор коллекций, а потом, не обращая внимания, переключился в режим выборки и подумал, что проблема решена. Теперь я совершенно не уверен. этого режима).

Любая помощь приветствуется,

С уважением

...