Ява.ленг.Исключение OutOfMemoryError: Java для кучи пространства

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

java.lang.OutOfMemoryError: Java heap space

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

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

  2. есть ли способ увеличить кучу космос?

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

10 ответов


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

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


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

2.- Да см. параметры Java VM

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

Ie

java -Xmx2g назначьте 2 гигабайта ОЗУ как максимум вашему приложению

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

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


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

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

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

отлично! Я дам 1G ОЗУ JVM.

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

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


чтобы увеличить размер кучи, вы можете использовать аргумент-Xmx при запуске Java; например

-Xmx256M

вы можете получить свой размер памяти кучи через ниже programe.

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

потом, соответственно, вы можете увеличить размер кучи также с помощью: в Java -Xmx2g http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html


  1. в большинстве случаев, код не оптимизирован. Освободите те предметы, которые, по вашему мнению, больше не понадобятся. Избегайте создания объектов в цикле каждый раз. Попробуйте использовать кэши. Я не знаю, как твое заявление. Но в программировании также применяется одно правило нормальной жизни

    профилактика лучше, чем лечение. "Не создавайте ненужных объектов"


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

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

куча не только содержит переменные экземпляра. Он будет хранить все непримитивные типы данных (объекты). Время жизни этих объектов может быть коротким (блок метода) или длинным (пока объект не будет указан в вашем приложении)

  1. есть ли способ увеличить пространство "кучи"?

да. Взгляните на этого оракула статьи для получения более подробной информации.

есть два параметра для настройки кучи размер:

- Xms:, который устанавливает начальный и минимальный размер кучи

- Xmx:, который устанавливает максимальный размер кучи

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

это зависит от вашего приложения.

  1. установите максимальную память кучи согласно вашему приложению требование

  2. не вызывают утечки памяти в вашем приложении

  3. если вы нашли утечки памяти в приложении, найдите первопричину с помощью инструментов профилирования, таких как мат, Visual VM , jconsole etc. Как только вы найдете причину, устранить утечки.

важные заметки от oracle статьи

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

возможные причины:

  1. неправильной конфигурации ( не выделяя хорошая память)
  2. приложение непреднамеренно содержит ссылки на объекты, и это предотвращает сбор мусора объектов
  3. приложения, которые чрезмерно используют финализаторы. Если класс имеет метод finalize, затем объекты этого типа не имеют своего пространства, исправленного во время сбора мусора. если поток финализатора не может идти в ногу с очередью завершения, то куча Java может заполнить, и этот тип исключения OutOfMemoryError будет брошен.

на другой ноте используйте лучшие алгоритмы сбора мусора (CMS или G1GC)

посмотри вопрос для понимание G1GC


  1. локальные переменные размещаются в стеке. Пространство кучи занято объектами.

  2. можно использовать .

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


Нет, я думаю, вы думаете о пространстве стека. Пространство кучи занято объектами. Способ увеличить его-Xmx256m, заменив 256 на сумму, необходимую в командной строке.


в netbeans перейдите на панель инструментов "Run", -- > "Set Project Configuration" -- > "Customise" -- > " run "Его всплывающего windo -- >" VM Option " -- > fill in '- Xms2048m-Xmx2048m'. Это может решить проблему размера кучи.