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

java.lang.OutOfMemoryError: Java heap space

java.lang.OutOfMemoryError: пространство кучи Java

Я получаю следующую ошибку при выполнении многопоточной программы

java.lang.OutOfMemoryError: Java heap space

Вышеупомянутая ошибка произошла в одном из потоков.


  1. Насколько мне известно, пространство кучи занято только переменными экземпляра. Если это верно, то почему эта ошибка произошла после того, как некоторое время все работало нормально, поскольку пространство для переменных экземпляра выделяется во время создания объекта.


  2. Есть ли какой-нибудь способ увеличить пространство кучи?


  3. Какие изменения я должен внести в свою программу, чтобы она занимала меньше места в куче?


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

Если вы хотите увеличить пространство кучи, вы можете использовать java -Xms<initial heap size> -Xmx<maximum heap size> в командной строке. По умолчанию значения зависят от версии JRE и конфигурации системы. Вы можете узнать больше о параметрах виртуальной машины на веб-сайте Java.

Однако я бы рекомендовал профилировать ваше приложение, чтобы выяснить, почему съедается размер вашей кучи. В NetBeans есть очень хороший профилировщик, входящий в комплект поставки. Я полагаю, что он использует jvisualvm под капотом. С помощью профилировщика вы можете попытаться найти, где создается много объектов, когда происходит сборка мусора и многое другое.

Ответ 2

1.- Да, но это в значительной степени относится ко всей памяти, используемой вашей программой.

2.- Да, смотрите параметры виртуальной машины Java

-Xms<size>        set initial Java heap size
-Xmx<size> set maximum Java heap size

Ie

java -Xmx2g выделите вашему приложению максимум 2 гигабайта оперативной памяти

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

3.- Это зависит от программы. Попробуйте выявить утечки памяти. На этот вопрос было бы сложно ответить. В последнее время вы можете профилировать с помощью JConsole, чтобы попытаться выяснить, куда направляется ваша память.

Ответ 3

Возможно, вы захотите заглянуть на этот сайт, чтобы узнать больше о памяти в JVM: http://developer.streamezzo.com/content/learn/articles/optimization-heap-memory-usage (ссылка на интернет-архив)

Я счел полезным использовать visualgc, чтобы наблюдать, как заполняются различные части модели памяти, чтобы определить, что следует изменить.

Трудно определить, какая часть памяти была заполнена, следовательно, visualgc, поскольку вы можете захотеть просто изменить часть, в которой возникла проблема, а не просто сказать,


Отлично! Я выделю 1 ГБ оперативной памяти для JVM.


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

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

Ответ 4

You can get your heap memory size through below programe.

public class GetHeapSize {
public static void main(String[] args) {
long heapsize = Runtime.getRuntime().totalMemory();
System.out.println("heapsize is :: " + heapsize);
}
}

then accordingly you can increase heap size also by using:
java -Xmx2g
http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

java multithreading