Часто я обнаруживал OutOfMemoryException на сервере приложений IBM Websphere. Я думаю, что это исключение возникает из-за того, что мое приложение извлекает огромные данные из базы данных. Итак, я ограничиваю все запросы, не извлекаю данные более 1000 записей и устанавливаю JVM для WAS, следуя
+ Verbose garbage collection
+ Maximum Heap size = 1024 (RAM on my server is 16 GB and now I already change to 8192)
+ Debug arguments = -Djava.compiler=NONE -Xdebug -Xnoagent
-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=7777
+ Generic JVM arguments = -Dsun.rmi.dgc.server.gcInterval=60000
-Dsun.rmi.dgc.client.gcInterval=60000 -Xdisableexplicitgc
-Dws.log=E:\WebApp\log -Dws.log.level=debug
(ws.log and ws.log.level are my properties)
И я нашел файлы куча, Javacore и щелчок в папке профилей. Я думаю, они могут рассказать мне о причине проблемы, но я не знаю, как читать / использовать файлы heapdump, javacore и snap.
Подскажите, пожалуйста, как предотвратить / избежать / исправить OutOfMemoryException. Спасибо




Ответ на это зависит от сообщения, связанного с OutOfMemoryException. Вы также можете попробовать -XX: MaxPermSize = ... и установить его на что-то большее, например 256 м.
Кроме того, если у вас где-то есть рекурсивная функция, это может вызвать переполнение стека.
Если можете, опубликуйте сообщение, связанное с исключением. Stacktrace также может помочь.
Если вы хотите просмотреть файлы дампа кучи, IBM предлагает инструменты для их анализа здесь.
Попробуйте воспроизвести проблему локально, чтобы вы могли использовать такой инструмент, как JProfiler, для ее отладки. Даже если вы не можете принудительно запустить OOM локально, скорее всего, вы увидите увеличение памяти в JProfiler. Затем вы делаете снимки и ищите классы, которые не собираются сборщиком мусора. Это не точная наука, но это намного проще, чем просматривать дамп IBM. Однако, если вам нужно, старый способ исследования дампа кучи был с помощью HeapRoots. Это может зависеть от вашей версии. Я знаю, что у некоторых версий IBM JDK есть проблемы с уплотнением, поэтому, даже если у вас много памяти, вы можете получить OOM, потому что нет достаточно большого доступного фрагмента.
Я предполагаю, что вы используете спящий режим / JPA в качестве поставщика постоянства? Вы используете кеш второго уровня? Если да, то рассматривали ли вы возможность удаления больших наборов результатов из кеша?
На этот вопрос трудно ответить, если мы не знаем, что это за Добрый OutOfMemoryError; permgen и heapspace - два очень разных зверя.
Я много месяцев гнался за перманентным генератором на JBoss, хотя именно этот тип проблемы был обычным для любого сервера приложений, который перезагружал веб-приложения на лету. Сага задокументирована здесь.
Те дампы кучи, которые у вас есть ... может быть, вы можете проанализировать их в Затмение MAT.
«Спасибо за память» - хорошая статья об использовании памяти JVM, которая может помочь проанализировать эту проблему ...
Спасибо Bwalliser за эту ссылку