Подтвердить что ты не робот

Как определить проблему, когда Java OutOfMemoryError?

Как определить проблему при запуске java OutOfMemoryError или stackoverflow. По какой причине это происходит или почему сервер не работает.

Например, я разрабатываю приложение, которое живет на производстве и UAT. Мгновенно при создании java OutOfMemoryError или stackoverflow.

Тогда как мы можем отслеживать эту проблему, по какой причине это произошло? Есть ли какой-либо метод, который может сказать мне, по какому потоку кода это происходит?

Пожалуйста, объясните это. Я много раз сталкивался с этой проблемой.

4b9b3361

Ответ 1

Если вы сталкиваетесь с этим на производстве, и вы не можете действительно рассуждать об этом из stacktraces или журналов, вам нужно проанализировать, что там было.

Получить VM для сброса в OOM

-XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath="/tmp"

И используйте это для анализа. Инструмент анализа памяти (http://eclipse.org/mat/) является хорошей автономной программой для этого анализа.

Ответ 2

Документация Oracle: - Устранение утечек памяти содержит подробное объяснение:

Эта ошибка возникает, когда недостаточно места для выделения объект в куче Java или в определенной области кучи. сборщик мусора не может сделать доступным дополнительное пространство для разместить новый объект, и куча не может быть расширена далее.

.....

Ранним шагом для диагностики OutOfMemoryError является определение того, что ошибка. Означает ли это, что куча Java заполнена, или это означает что нативная куча полна? Чтобы помочь вам ответить на этот вопрос, следующие подразделы объясняют некоторые возможные сообщения об ошибках, со ссылкой на детальную часть сообщения:

Исключение в потоке "main" : java.lang.OutOfMemoryError: куча Java пространство

См. 3.1.1 Подробное сообщение: пространство кучи Java.

Исключение в потоке "main" : java.lang.OutOfMemoryError: пространство PermGen

См. 3.1.2 Подробное сообщение: пространство PermGen.

Исключение в потоке "main" : java.lang.OutOfMemoryError: Requested размер массива превышает предел VM

См. 3.1.3 Подробное сообщение: размер запрашиваемого массива превышает предел VM.

Исключение в потоке "main" : java.lang.OutOfMemoryError: request байтов для. Из области подкачки?

См. 3.1.4 Подробное сообщение: запросить байты для. Снаружи swap space?.

Исключение в потоке "main" : java.lang.OutOfMemoryError:  (Нативный метод)

См. 3.1.5 Подробное сообщение: (Родной способ).

UPDATE: -

Вы можете загрузить исходный код HotSpot VM из OpenJDK. Если вы хотите отслеживать и отслеживать объем памяти ваших пространств Java Heap, то есть пространство для молодого поколения и старого поколения должно включать подробный GC с вашей виртуальной машины HotSpot. Вы можете добавить следующие параметры в свои аргументы запуска JVM:

-verbose:gc –XX:+PrintGCDetails –XX:+PrintGCTimeStamps –Xloggc:<app path>/gc.log

Ответ 3

Вы можете использовать jvisualvm для управления процессом во время выполнения.

Вы можете видеть память, пространство кучи, объекты и т.д.

Эта программа находится в вашем каталоге bin вашего JDK.

Ответ 4

Лучше всего попытаться воспроизвести проблему, где вы можете ее отлаживать - на сервере dev или на вашем локальном компьютере. Затем попробуйте отлаживать, искать рекурсивные вызовы, размер кучи и какие объекты создаются. К сожалению, не всегда легко воспроизвести prod env (с его загрузкой и т.д.) На локальной машине, поэтому найти основную причину такой ошибки может быть проблемой.

Ответ 5

Объем памяти, заданный процессу Java, указывается при запуске. память разделена на отдельные области, куча и пермген - наиболее знакомые под-области.

Пока вы указываете максимальный размер кучи, разрешенный для этого конкретного процесса, через -Xmx, соответствующий параметр для permgen равен -XX: MaxPermSize. Кажется, что 90% приложений Java требуют от 64 до 512 Мбайт подмножества для правильной работы. Чтобы найти свои ограничения, немного экспериментируйте.

чтобы решить эту проблему, вы изменили свои аргументы VM

-Xms256m -Xmx1024m -XX:+DisableExplicitGC -Dcom.sun.management.jmxremote
-XX:PermSize=256m -XX:MaxPermSize=512m

добавить две строки в аргументе VM, я уверен, что вы больше не столкнетесь с этой проблемой

чтобы узнать больше о переходе на OutOfMemory

Ответ 6

Конфигурация с низкой памятью: -

Возможно, что у вас есть меньше памяти для вашего приложения, например, для вашего приложения требуется 2 Гб памяти, но вы настроили только 512 Мб, поэтому здесь вы получите НЕОБХОДИМЫЕ (ошибки вне памяти)

Из-за Memoryleak: -

Утечка памяти отвечает за уменьшение доступной памяти для кучи и может привести к ошибке из памяти для большего количества чтения. Что такое утечка памяти в java?

Фрагментация памяти: -

Возможно, что в куче может быть место, но оно может быть не смежным. А куча нуждается в уплотнении. Переупорядочивайте память.

Избыточные издержки GC: -

Некоторые реализации JVM, такие как Oracle HotSpot, будут вызывать ошибку вне памяти, когда накладные расходы GC становятся слишком большими. Эта функция предназначена для предотвращения почти постоянной сборки мусора, например, затрачивая более 90% времени выполнения на сборку мусора, освобождая менее 2% памяти. Настройка большей кучи, скорее всего, устранит эту проблему, но если вам не нужно анализировать использование памяти с помощью кучи дампов

Выделение избыточных временных объектов: -

Программная логика, которая пытается выделить слишком большие временные объекты. Так как JVM can not удовлетворяет запросу, инициируется ошибка из-за памяти, и транзакция будет прервана. Это может быть трудно диагностировать, так как ни один кустарник или инструмент анализа распределения не осветят проблему. Вы можете идентифицировать область кода, вызывающую ошибку, и после обнаружения, устранения или устранения причины проблемы.

для большего количества посещений сайта на моем сайте

http://all-about-java-and-weblogic-server.blogspot.com/2014/02/main-causes-of-out-of-memory-errors-in.html