Как найти, какой класс вызывает OutOfMemory для JVM? - PullRequest
3 голосов
/ 18 февраля 2011

На нашем сервере Weblogic часто происходит сбой с ошибкой OutOfMemory.Можно ли как-нибудь контролировать JVM, чтобы узнать, какие классы занимают память и имеют максимальное количество объектов?

Ответы [ 5 ]

4 голосов
/ 18 февраля 2011

да.Я сделал это, настроив jvm для создания дампа кучи в OOM, затем спустил кучу и запустил ее через jvisualvm.Вы можете вычислить оставшиеся размеры (это заняло много времени), но вам будет очень ясно, что это за нарушитель.

Вы также можете присоединить jvisualvm к работающему экземпляру, но вам нужно настроить jvm для принятия соединения.,Таким образом, вы можете наблюдать за ростом кучи в режиме реального времени.Видеть это;это для jboss, но должно быть очень похоже: https://wiki.projectbamboo.org/display/BTECH/VisualVM+Profiler

Я думаю, что легче получить ответ после того, как у вас есть дамп кучи, хотя, когда вы смотрите его в реальном времени, вещи собираются и тому подобное.

РЕДАКТИРОВАТЬ - вот мои настройки запуска.

-XX:+PrintGCDetails -XX:+PrintGCTimeStamps  
-Xloggc:/path/to/memlogs/memlog.txt -XX:+PrintTenuringDistribution   
-Xms1024m -Xmx2048m -XX:MaxPermSize=128m   
-server -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=xxxx   
-Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false   
-Djava.rmi.server.hostname=<ip-address> -XX:+HeapDumpOnOutOfMemoryError   
-XX:HeapDumpPath=/path/to/heapdumps/ -XX:+CMSClassUnloadingEnabled   
-XX:+CMSPermGenSweepingEnabled -XX:+UseConcMarkSweepGC  

, поскольку я настроил его для удаления журналов памяти, я могу в реальном времени подключить файл memlog.txt, чтобы увидеть, что произошло.Я могу подключиться к jvm, если захочу, но, как я уже сказал, я просто проанализирую кучу после сбоя, чтобы увидеть, в чем проблема, потому что по факту ее действительно ясно ....

2 голосов
/ 18 февраля 2011

Помимо JConsole, jRat - это один из хороших профилировщиков «как в пиве», YourKit - еще один отличный коммерческий продукт.

2 голосов
/ 18 февраля 2011

Существует несколько инструментов, но я использую Eclipse Memory Analysis Toolkit.Вы можете загрузить его как самостоятельный инструмент, и он позволит вам выполнять анализ кучи и даже подключаться к JVM и выполнять там анализ.

2 голосов
/ 18 февраля 2011

Есть JConsole с JDK 1.5 (или 5.0, если вы в этом).

0 голосов
/ 20 февраля 2011

Из некоторых других Вопросов, которые я узнал о jhat и jmap.Они уже доступны в пакетах JDK.Также по ссылке ниже представлен хороший список того, какой инструмент использовать в каких сценариях: -

http://java.sun.com/developer/technicalArticles/J2SE/monitoring/

...