Рубрики
Без рубрики

ява.ланг.OutOfMemoryError: пространство кучи Java

java lang OutOfMemoryError Пространство кучи Java, Java OutOfMemoryError, java.lang.Ошибка из памяти, Как исправить java.lang.OutOfMemoryError пространство кучи java за счет увеличения размера кучи

Автор оригинала: Pankaj Kumar.

ява.ланг.Ошибка OutOfMemoryError возникает, когда JVM не может выделить память для создания объекта. Ошибка Java OutOfMemoryError является ошибкой и возникает во время выполнения.

ява.ланг.Ошибка OutOfMemoryError возникает, когда JVM не может выделить память для создания объекта. Ошибка Java OutOfMemoryError является ошибкой и возникает во время выполнения.

Как следует из названия, OutOfMemoryError возникает, когда во время выполнения java не хватает памяти. В этом случае сборщик мусора не может освободить больше места, требуемого программой, и, следовательно, возникает ошибка.

Есть две основные причины получить java.lang.Ошибка из памяти :

  1. Плохое программирование – бесконечный цикл, не очистка памяти путем закрытия ресурсов и т.д.
  2. Низкий объем памяти – 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) {
		List list = 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