Encountered an unexpected exception java lang outofmemoryerror java heap space

Как справиться с ошибкой «java.lang.OutOfMemoryError: Java heap space»

Ошибка «java.lang.OutOfMemoryError: Java heap space» – это типичная проблема, с которой сталкиваются разработчики на Java. Это случается, когда виртуальная машина Java (JVM) не может выделить объекту достаточно памяти из кучи. Куча – это область памяти, выделенная JVM для хранения объектов.

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

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

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

  1. Увеличение максимального размера кучи. Это можно сделать, установив параметр командной строки -Xmx . Например, -Xmx512m устанавливает максимальный размер кучи в 512 мегабайт. Но стоит помнить, что увеличение размера кучи до бесконечности не решит проблему, если есть утечка памяти в программе.
  2. Сохранение объектов на диск. Это может быть полезно, если программа работает с большим объемом данных, которые не нужны в памяти все время. Объекты можно сериализовать и сохранить на диск, а затем загрузить обратно, когда они понадобятся.
  3. Использование виртуальной памяти. В некоторых случаях можно использовать виртуальную память для увеличения доступного пространства кучи.
Читайте также:  Search type html css

Лучшим решением будет комбинация этих методов, а также оптимизация кода для более эффективного использования памяти.

Источник

Какие бывают типы OutOfMemoryError или из каких частей состоит память java процесса

Если вы словили OutOfMemoryError, то это вовсе не значит, что ваше приложение создает много объектов, которые не могут почиститься сборщиком мусора и заполняют всю память, выделенную вами с помощью параметра -Xmx. Я, как минимум, могу придумать два других случая, когда вы можете увидеть эту ошибку. Дело в том, что память java процесса не ограничивается областью -Xmx, где ваше приложение программно создает объекты.

image

Область памяти, занимаемая java процессом, состоит из нескольких частей. Тип OutOfMemoryError зависит от того, в какой из них не хватило места.

1. java.lang.OutOfMemoryError: Java heap space

Не хватает место в куче, а именно, в области памяти в которую помещаются объекты, создаваемые программно в вашем приложении. Размер задается параметрами -Xms и -Xmx. Если вы пытаетесь создать объект, а места в куче не осталось, то получаете эту ошибку. Обычно проблема кроется в утечке памяти, коих бывает великое множество, и интернет просто пестрит статьями на эту тему.

2. java.lang.OutOfMemoryError: PermGen space

Данная ошибка возникает при нехватке места в Permanent области, размер которой задается параметрами -XX:PermSize и -XX:MaxPermSize. Что там лежит и как бороться с OutOfMemoryError возникающей там, я уже описал подробнейшим образом тут.

3. java.lang.OutOfMemoryError: GC overhead limit exceeded

Данная ошибка может возникнуть как при переполнении первой, так и второй областей. Связана она с тем, что памяти осталось мало и GC постоянно работает, пытаясь высвободить немного места. Данную ошибку можно отключить с помощью параметра -XX:-UseGCOverheadLimit, но, конечно же, её надо не отключать, а либо решать проблему утечки памяти, либо выделять больше объема, либо менять настройки GC.

4. java.lang.OutOfMemoryError: unable to create new native thread

Впервые я столкнулся с данной ошибкой несколько лет назад, когда занимался нагрузочным тестированием и пытался выяснить максимальное количество пользователей, которые могут работать с нашим веб-приложением. Я использовал специальную тулзу, которая позволяла логинить пользователей и эмулировать их стандартные действия. На определенном количестве клиентов, я начал получать OutOfMemoryError. Не особо вчитываясь в текст сообщения и думая, что мне не хватает памяти на создание сессии пользователя и других необходимых объектов, я увеличил размер кучи приложения (-Xmx). Каково же было мое удивление, когда после этого количество пользователей одновременно работающих с системой только уменьшилось. Давайте подробно разберемся как же такое получилось.

На самом деле это очень просто воспроизвести на windows на 32-битной машине, так как там процессу выделяется не больше 2Гб.

Допустим у вас есть приложение с большим количеством одновременно работающих пользователей, которое запускается с параметрами -Xmx1024M -XX:MaxPermSize=256M -Xss512K. Если всего процессу доступно 2G, то остается свободным еще коло 768M. Именно в данном остатке памяти и создаются стеки потоков. Таким образом, примерно вы можете создать не больше 768*(1024/512)=1536 (у меня при таких параметрах получилось создать 1316) нитей (см. рисунок в начале статьи), после чего вы получите OutOfMemoryError. Если вы увеличиваете -Xmx, то количество потоков, которые вы можете создать соответственно уменьшается. Вариант с уменьшением -Xss, для возможности создания большего количества потоков, не всегда выход, так как, возможно, у вас существуют в системе потоки требующие довольно больших стеков. Например, поток инициализации или какие-нибудь фоновые задачи. Но все же выход есть. Оказывается при программном создании потока, можно указать размер стека: Thread(ThreadGroup group, Runnable target, String name,long stackSize). Таким образом вы можете выставить -Xss довольно маленьким, а действия требующие больших стеков, выполнять в отдельных потоках, созданных с помощью упомянутого выше конструктора.

Более подробно, что же лежит в стеке потока, и куда уходит эта память, можно прочитать тут.

Конечно, вам может показаться данная проблема слегка надуманной, так как большинство серверов нынче крутиться на 64-битной архитектуре, но все же считаю данный пример весьма полезным, так как он помогает разобраться из каких частей состоит память java-процесса.

Источник

How to Fix java.lang.OutOfMemoryError in Minecraft

When you’re joining a Minecraft server or your singleplayer world, you might encounter a set of errors. Let’s find out how to fix java.lang.OutOfMemoryError in Minecraft, which is pretty common with low-end computers.

What Kind of Error Is java.lang.OutOfMemoryError?

Encountering java.lang.OutOfMemoryError in Minecraft

As the name of the error suggests, it’s a memory-related issue. This means that you either don’t have enough space in your computer, or Minecraft can’t use enough RAM. It gets way more complicated than this, though, so let’s check out some solutions.

How to Fix the Minecraft java.lang.OutOfMemoryError Error?

Many Minecraft errors can simply be fixed if you do the following:

This will usually be enough to fix java.lang.OutOfMemoryError or any other error. But if the issue persists, you’ll have to try more advanced solutions. Thankfully, there are a few ways to fix this error.

Change Your Profile’s JVM Arguments

Changing the JVM Arguments

Changing your profile’s JVM arguments will allow you to allocate more RAM to Minecraft. The process is pretty simple, and it can be done straight from the Minecraft Launcher:

  1. Open the Minecraft Launcher.
  2. Click on Installations.
  3. Select your Minecraft version, click on the 3 dots, and select “Edit”.
  4. At the bottom of the page, select “More Options”.

At this point, you should see a “Java Executable” and a “JVM Arguments” line. The first argument on the latter should be the following: “-Xmx#G”, or “-Xmx#M”.

This is the amount of RAM you want to allocate to Minecraft (with M symbolizing megabytes and G symbolizing gigabytes). So, simply input a larger number according to how much RAM you have (i.e. If you have 8GBs of RAM, allocating 2-3 for Minecraft should be enough).

Delete _JAVA_OPTIONS in Environmental Variables

Finding the JAVA_OPTIONS in Environmental Variables

Oftentimes, other software might create a variable to restrict the RAM allocation for Java programs. Deleting this is similar to fixing the JNI Error in Minecraft:

  1. Press the Windows+R key, type “sysdm.cpl”, and press Enter.
  2. Select “Advanced” at the top, and click on “Environment Variables”.

You should locate a _JAVA_OPTIONS variable under “System Variables”, which you’ll need to delete. To do this, click on it and select “Delete”. Once that’s done, restart your computer to see if the java.lang.OutOfMemoryError persists.

Reinstall Java

If all else fails to fix the error, reinstalling Java should help you out. You can get this done quickly by downloading the Java uninstall tool and installing the latest Java version.

Upgrade Your Device’s RAM

Since the error is memory-related, you might need to upgrade your hardware. If none of the software fixes I mentioned above worked for you, you’ll need additional RAM sticks to run your server or world.

Conclusion

These solutions have hopefully helped you fix java.lang.OutOfMemoryError in Minecraft. You could try reinstalling the game if the error still troubles you. Or, you can check out one of the numerous threads on this issue on the Minecraft Forum for additional help.

Источник

Оцените статью