- Как справиться с ошибкой «java.lang.OutOfMemoryError: Java heap space»
- Какие бывают типы OutOfMemoryError или из каких частей состоит память java процесса
- 1. java.lang.OutOfMemoryError: Java heap space
- 2. java.lang.OutOfMemoryError: PermGen space
- 3. java.lang.OutOfMemoryError: GC overhead limit exceeded
- 4. java.lang.OutOfMemoryError: unable to create new native thread
- How to Fix java.lang.OutOfMemoryError in Minecraft
- What Kind of Error Is java.lang.OutOfMemoryError?
- How to Fix the Minecraft java.lang.OutOfMemoryError Error?
- Change Your Profile’s JVM Arguments
- Delete _JAVA_OPTIONS in Environmental Variables
- Reinstall Java
- Upgrade Your Device’s RAM
- Conclusion
Как справиться с ошибкой «java.lang.OutOfMemoryError: Java heap space»
Ошибка «java.lang.OutOfMemoryError: Java heap space» – это типичная проблема, с которой сталкиваются разработчики на Java. Это случается, когда виртуальная машина Java (JVM) не может выделить объекту достаточно памяти из кучи. Куча – это область памяти, выделенная JVM для хранения объектов.
Примером может служить ситуация, когда создается большое количество объектов, и все они хранятся в памяти. Например, при чтении большого количества файлов без последующего освобождения памяти. Если количество доступной памяти исчерпано, то JVM генерирует ошибку OutOfMemoryError.
Прежде всего, стоит быть внимательным к использованию памяти и стараться её экономить.
Однако, если проблему не удается решить на этапе написания кода, есть несколько способов обойти ограничение:
- Увеличение максимального размера кучи. Это можно сделать, установив параметр командной строки -Xmx . Например, -Xmx512m устанавливает максимальный размер кучи в 512 мегабайт. Но стоит помнить, что увеличение размера кучи до бесконечности не решит проблему, если есть утечка памяти в программе.
- Сохранение объектов на диск. Это может быть полезно, если программа работает с большим объемом данных, которые не нужны в памяти все время. Объекты можно сериализовать и сохранить на диск, а затем загрузить обратно, когда они понадобятся.
- Использование виртуальной памяти. В некоторых случаях можно использовать виртуальную память для увеличения доступного пространства кучи.
Лучшим решением будет комбинация этих методов, а также оптимизация кода для более эффективного использования памяти.
Какие бывают типы OutOfMemoryError или из каких частей состоит память java процесса
Если вы словили OutOfMemoryError, то это вовсе не значит, что ваше приложение создает много объектов, которые не могут почиститься сборщиком мусора и заполняют всю память, выделенную вами с помощью параметра -Xmx. Я, как минимум, могу придумать два других случая, когда вы можете увидеть эту ошибку. Дело в том, что память java процесса не ограничивается областью -Xmx, где ваше приложение программно создает объекты.
Область памяти, занимаемая 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:
- Open the Minecraft Launcher.
- Click on Installations.
- Select your Minecraft version, click on the 3 dots, and select “Edit”.
- 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:
- Press the Windows+R key, type “sysdm.cpl”, and press Enter.
- 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.