В моем приложении 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 и заполняет список на основе этого содержимого) и профилируйте его в режиме выборки, я получаю следующий график:
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 :
Объекты в памяти в инструментированном профиле
На этот раз используемая куча продолжает увеличиваться с течением времени, как если бы все еще была утечка памяти.
Сначала я использовал инструментальный режим, чтобы получить объекты, которые сохраняли уцелевший мусор коллекций, а потом, не обращая внимания, переключился в режим выборки и подумал, что проблема решена. Теперь я совершенно не уверен. этого режима).
Любая помощь приветствуется,
С уважением