Когда JVM падает (segfaults) во время сбора мусора, как я могу узнать, что собиралось?

Я получаю segfaults в своей JVM примерно на той же фазе приложения, но с разными стеками стека в отчете о сбое. Однако это всегда происходит во время GC.

Поскольку авария происходит во всех трех JVM, которые я пробовал (OpenJDK 6, Oracle 1.6.0_25 и 1.7.0) и с двумя GC каждый (Parallel Collector и CMS), и это происходит вокруг одной и той же области приложения, я Если бы я мог найти то, что собирался собирать GC, я мог бы заметить некоторые особенности моего кода, которые приводят к этому сбою.

  • Существуют ли какие-либо методы кодирования, которые, как известно, проблематичны для GC?
  • Какие методы доступны для диагностики этой проблемы?
  • Могу ли я сделать какие-либо обоснованные предположения о том, где в моем приложении эта проблема срабатывает?
  • Какие параметры (GC tuning) можно воспроизвести, чтобы уменьшить проблему?
  • Есть ли способ обнаружить (возможно) проблемные данные в дампе кучи?

Ответ 1

Это произойдет, если у вас есть библиотека JNI, которая неправильно обрабатывает память. Проблема не проявляется сразу. Однако, когда GC выполняется, он сканирует всю память, отключает поврежденную ссылку и убивает JVM. т.е. коррупция могла произойти в любое время после последнего полного GC.

Ответ 2

  • Сегрегаторы имеют определенные коды ошибок в начале дампа http://en.wikipedia.org/wiki/Segmentation_fault

  • Вы можете использовать Thread.dumpStackTrace, чтобы узнать, что происходит в этом приложении Если вы точно знаете, где ваше приложение замерзает или замерзает после определенного действия или события, вы можете CTRL + разорвать окна или CTRL + \, чтобы получить дамп потока, и посмотреть, что происходит.

  • Вместо того, чтобы смутно угадывать, вы можете прокомментировать некоторые разделы кода, чтобы узнать, какой цикл или объект или буфер или строка занимает слишком много времени.

  • В зависимости от вашей ситуации вы можете рассмотреть некоторые конкретные инструменты.

Ответ 3

  • Я предлагаю вам получить как дамп потока, так и кучу дампа, вы можете сделать это либо из командной строки, используя инструмент, например Visual VM
  • Я думаю, что куча кучи, являющаяся снимком JVM-памяти, предоставит информацию о живых объектах и ​​их распределениях. Если вы анализируете кучу с помощью Visual VM, она предоставляет подробный отчет обо всех объектах в куче
  • Я бы посоветовал вам собрать коллекцию GC в своем приложении для подробного анализа и анализа с помощью инструмента, такого как tagtraum
  • Если вы можете прикрепить JVM-профайлер, который может предоставить много информации или если у вас есть общее представление о рабочем потоке, который вызывает проблема тогда просто профиль, который в изоляции

Ответ 4

Мы также столкнулись с аналогичной проблемой. Не было никакой картины, которую мы могли бы видеть, и это было довольно случайным, но происходило либо на GC, либо на Full GC. Для нас это оказалось проблемой с модулями ОЗУ. Мы идентифицировали его с помощью MemTest86 + на сервере Ubuntu.