Автор оригинала: Pankaj Kumar.
ява.ланг.Ошибка OutOfMemoryError возникает, когда JVM не может выделить память для создания объекта. Ошибка Java OutOfMemoryError является ошибкой и возникает во время выполнения.
ява.ланг.Ошибка OutOfMemoryError возникает, когда JVM не может выделить память для создания объекта. Ошибка Java OutOfMemoryError является ошибкой и возникает во время выполнения.
Как следует из названия, OutOfMemoryError
возникает, когда во время выполнения java не хватает памяти. В этом случае сборщик мусора не может освободить больше места, требуемого программой, и, следовательно, возникает ошибка.
Есть две основные причины получить java.lang.Ошибка из памяти
:
- Плохое программирование – бесконечный цикл, не очистка памяти путем закрытия ресурсов и т.д.
- Низкий объем памяти – java работает с меньшим объемом памяти, чем требуется.
Java OutOfMemoryError – Плохой пример Программирования
Давайте рассмотрим пример кода, который будет выдавать java.lang.OutOfMemoryError: пространство кучи Java
потому что программа переходит в бесконечный цикл, и объекты создаются, но не собираются в мусор. Таким образом, в конечном итоге у JVM закончится память.
package com.journaldev.exceptions; import java.util.ArrayList; import java.util.List; import java.util.Random; public class JavaOutOfMemoryErrorExample { public static void main(String[] args) { Listlist = new ArrayList<>(); Random random = new Random(); while (true) list.add(random.nextInt()); } }
Когда приведенный выше код будет выполнен, через некоторое время он выдаст следующее исключение.
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.base/java.lang.Integer.valueOf(Integer.java:1050) at com.journaldev.exceptions.JavaOutOfMemoryErrorExample.main(JavaOutOfMemoryErrorExample.java:15)
Это пример плохого программирования, но хорошей новостью является то, что трассировка стека исключений четко указывает нам на поиск кода, в котором произошла эта ошибка. Однако иногда проблема может возникнуть в некоторых других областях программы, в этом случае нам понадобится помощь профилировщиков java, таких как VisualVM, чтобы выяснить, где выделяется большая часть памяти и как ее оптимизировать.
Java OutOfMemoryError – Пример нехватки памяти
Давайте рассмотрим другой пример, в котором ошибка OutOfMemoryError
вызвана тем, что мы не выделили достаточно памяти для правильного выполнения программы.
public class JavaOutOfMemoryErrorExample { public static void main(String[] args) { Integer[] array = new Integer[1000*1000*100]; System.out.println("Done"); } }
Давайте посмотрим, что произойдет, когда мы запустим вышеуказанную программу с максимальным ограничением памяти JVM 32 МБ.
$javac JavaOutOfMemoryErrorExample.java $java -Xmx32m JavaOutOfMemoryErrorExample Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at JavaOutOfMemoryErrorExample.main(JavaOutOfMemoryErrorExample.java:5)
Поскольку мы видим, что в программе нет ничего плохого, мы запускаем ее с очень низким объемом памяти. Давайте попробуем исправить эту ошибку OutOfMemoryError, увеличив объем памяти JVM до 256 МБ, а затем до 512 МБ.
$java -Xmx256m JavaOutOfMemoryErrorExample Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at JavaOutOfMemoryErrorExample.main(JavaOutOfMemoryErrorExample.java:5) $java -Xmx512m JavaOutOfMemoryErrorExample Done $
Таким образом, кажется, что наша программа работает нормально, когда мы предоставляем достаточно памяти для ее запуска.
Увеличение памяти JVM-это быстрое решение проблемы, если только у вас не очень мало памяти. Если вы уже используете большой объем памяти JVM, например 2 ГБ или более, вам следует изучить код приложения для его оптимизации, просмотреть дамп потоков и выходные данные профилировщика java, чтобы понять, почему вашему приложению требуется большой объем памяти и можно ли его уменьшить.
Ссылка: API Doc