Вопрос-ответ

What is an OutOfMemoryError and how do I debug and fix it

Что такое OutOfMemoryError и как мне это отладить и исправить

Моя Java-программа выдала ошибкуOutOfMemoryError. Как мне отладить и исправить эту проблему?


Многие новички в Java с трудом справляются с an OutOfMemoryError. Это попытка создать канонический вопрос, который ответит на наиболее часто задаваемые вопросы об an OutOfMemoryError. Я создаю этот новый вопрос, а не адаптирую один из многочисленных предыдущих вопросов об a OutOfMemoryError потому что эти вопросы и ответы на них тесно связаны с конкретной проблемой, с которой столкнулся человек.

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

Переведено автоматически
Ответ 1

An OutOfMemoryError - это исключение, создаваемое виртуальной машиной Java (JVM), поскольку ей необходимо выделить память для (нового) объекта, но для объекта доступно недостаточно памяти. JVM сначала попытается освободить память, используемую мертвыми объектами, запустив сборщик мусора.

Поскольку an OutOfMemoryError есть VirtualMachineError, JVM разрешено выбрасывать его в любое время, хотя сначала она должна попытаться освободить память с помощью сборки мусора.

Однако на практике это, скорее всего, происходит из new инструкции, которая пыталась создать объект, для которого не удалось выделить память. Таким образом, вы должны сначала изучить stacktrace, связанный с исключением, для получения подсказок о причине проблемы, как и для любого другого исключения.


  • Если исключение возникает при попытке выделить массив (например, int[] values = new int[n]), причиной может быть то, что вы пытаетесь создать чрезмерно большой массив (n слишком большой). Вы допустили ошибку при вычислении размера нужного вам массива?

  • Если исключение возникает при попытке выделить массив в методе контейнерного класса, написанного кем-то другим, причиной может быть то, что ваш код запрашивает контейнер для хранения чрезмерного количества объектов. Такие методы, как ArrayList.reserve(int) и HashMap(int), должны выделять хранилище для использования в будущем. Вы допустили ошибку при расчете размера необходимого вам контейнера?

  • Если исключение генерируется внутри цикла, причиной может быть то, что код повторялся слишком много раз. Правильно ли ваше условие завершения цикла? Если это for цикл, вы просите его повторить цикл нужное количество раз?

Если stacktrace не предоставляет достаточно подсказок, вы могли бы попробовать использовать профилировщик кучи. Это программа мониторинга, которая позволяет вам проверять память, используемую для объектов во время выполнения программы, или проверяет дамп кучи, записанный при завершении программы. Он может предоставлять информацию о размерах, количестве и классах объектов, хранящихся в памяти.

JVM имеет в своем распоряжении конечный объем памяти. Вы можете сделать вывод, что ваша программа работает правильно, но ей просто требуется больше памяти для запуска, чем ей было предоставлено. Если вы явно не укажете JVM, какой объем памяти использовать, большинство реализаций выберут разумный объем по умолчанию в зависимости от объема оперативной памяти, который есть на вашем компьютере, но этот объем может быть слишком мал для вашей программы. Параметры командной строки для JVM могут управлять объемом доступной памяти. Для большинства реализаций JVM наиболее важными из этих параметров являются -Xmx и -Xms.

Ответ 2

Для отладки OutOfMemoryError, вызовите JVM с -XX:+HeapDumpOnOutOfMemoryError опцией, которая вызовет запись дампа кучи при возникновении OutOfMemoryError. Затем используйте такой инструмент, как VisualVM, jhat или fasthat, чтобы просмотреть дамп кучи.

Вы также можете в любое время сгенерировать дамп кучи вручную, используя jmap с -dump опцией.

Раскрытие информации: Я сопровождающий fasthat, который является форком jhat.

Ответ 3

When the application resources run out of the allocated memory of JVM heap, the OutOfMemmoryException is thrown. Try increasing JVM heap size.

Ответ 4

This problem occur when tomcat goes out of memory i.e tomcat has less memory configured then the application required to run application.

So to overcome this problem go to the tomcat bin directory and create a new file setenv.bat and define PermSize in that file as below:

set JAVA_OPTS=-Dfile.encoding=UTF-8 -Xms512m -Xmx1024m -XX:PermSize=512m -XX:MaxPermSize=1024m

PermSize can be set to more higher range according to the application requirement.

2023-09-27 00:31 java exception