Вопрос

Часто я обнаруживал исключение 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)

И я обнаружил файлы heapdump , javacore и snap в папке профилей. Думаю, они могут сообщить мне о причине проблемы, но я не не умеет читать / использовать файлы heapdump, javacore и snap.

Пожалуйста, скажите мне, как предотвратить / избежать / исправить OutOfMemoryException. Благодаря

Это было полезно?

Решение

Ответ на этот вопрос зависит от сообщения, связанного с OutOfMemoryException. Вы также можете попробовать -XX: MaxPermSize = ... и установить его на что-то большее, например, 256 м.

Кроме того, если у вас где-то есть рекурсивная функция, это может вызвать переполнение стека.

Если можете, опубликуйте сообщение, связанное с исключением. Stacktrace также может помочь.

Другие советы

Если вы хотите посмотреть файлы дампа кучи, IBM предлагает инструменты для их анализа здесь .

"Спасибо за память" - хорошая статья об использовании памяти JVM, которая может помочь проанализировать эту проблему ...

Спасибо bwalliser за эту ссылку

Попробуйте воспроизвести проблему локально, чтобы вы могли использовать такой инструмент, как JProfiler, для его устранения. Даже если вы не можете форсировать OOM локально, скорее всего, вы увидите увеличение памяти в JProfiler. Затем вы делаете снимки и ищите классы, которые не собираются мусором. Это не точная наука, но это намного проще, чем смотреть в кучу IBM. Однако, если вам нужно, старый способ проверки дампа кучи был с HeapRoots. Это может зависеть от версии, на которой вы находитесь. Я знаю, что в некоторых версиях IBM JDK возникают проблемы с уплотнением, поэтому даже если у вас достаточно памяти, вы можете получить OOM, потому что недостаточно большого фрагмента.

Я предполагаю, что вы используете hibernate / JPA в качестве поставщика сохраняемости? Вы используете кэш второго уровня? Если это так, вы рассматривали возможность удаления больших наборов результатов из кэша?

На вопрос трудно ответить, если мы не знаем, какой это вид из OutOfMemoryError; permgen и heapspace - два совершенно разных зверя.

Я много месяцев гонялся за Perm-gen на JBoss, хотя этот специфический тип проблем был общим для любого сервера приложений, который перезагружал веб-приложения на лету. Сага описана здесь .

Эти дампы кучи ... у вас есть возможность проанализировать их в Eclipse MAT .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top