Как бороться с » java.ленг.Ошибка «OutOfMemoryError: Java heap space» (размер кучи 64 МБ)
учитывая эту ситуацию, как я должен бороться с этим ограничением?
я мог бы увеличить максимальный размер кучи используя командная строка опция java, но для этого потребуется выяснить доступную ОЗУ и написать некоторую программу запуска или скрипт. Кроме того, увеличение до некоторого конечного максимума в конечном итоге не избавляет от проблемы.
я мог бы переписать часть моего кода, чтобы часто сохранять объекты в файловой системе (используя базу данных то же самое), чтобы освободить память. Это может сработать, но это, вероятно, тоже много работы.
Если бы вы могли указать мне на детали вышеуказанных идей или некоторые альтернативы, такие как автоматическая виртуальная память, динамически расширяя размер кучи, это будет здорово.
18 ответов
в конечном счете у вас всегда есть конечный максимум кучи, чтобы использовать независимо от того, на какой платформе вы работаете. В Windows 32 бит это около 2 Гб (не конкретно куча, но общий объем памяти на процесс). Просто случается, что Java решает сделать значение по умолчанию меньше (предположительно, чтобы программист не мог создавать программы с неуправляемым распределением памяти, не сталкиваясь с этой проблемой и не изучая точно, что они делают).
Так это учитывая, что есть несколько подходов, которые вы можете предпринять, чтобы определить, какой объем памяти вам нужен, или уменьшить объем используемой памяти. Одной из распространенных ошибок в языках сбора мусора, таких как Java или C#, является сохранение ссылок на объекты, которые вы больше не используете, или выделение многих объектов, когда вы можете использовать их вместо этого. Пока объекты имеют ссылку на них, они будут продолжать использовать пространство кучи, поскольку сборщик мусора не удалит их.
в этом случае вы можно использовать профилировщик памяти Java, чтобы определить, какие методы в вашей программе выделяют большое количество объектов, а затем определить, есть ли способ убедиться, что они больше не ссылаются или не выделяют их в первую очередь. Один вариант, который я использовал в прошлом «СПМ» http://www.khelekore.org/jmp/.
Если вы определяете, что вы выделяете эти объекты по какой-то причине, и вам нужно сохранить ссылки (в зависимости от того, что вы делаете это возможно, это так), вам просто нужно будет увеличить максимальный размер кучи при запуске программы. Однако, как только вы сделаете профилирование памяти и поймете, как выделяются ваши объекты, вы должны иметь лучшее представление о том, сколько памяти вам нужно.
В общем, если вы не можете гарантировать, что ваша программа будет работать в некотором конечном объеме памяти (возможно, в зависимости от размера ввода), вы всегда столкнетесь с этой проблемой. Только после исчерпания всего этого вам нужно будет посмотреть в кэширование объектов на диск и т. д. На данный момент у вас должна быть очень веская причина сказать: «Мне нужен Xgb памяти» для чего-то, и вы не можете обойти это, улучшив свои алгоритмы или шаблоны выделения памяти. Как правило, это происходит только в случае алгоритмов, работающих с большими наборами данных (например, с базой данных или какой-либо программой научного анализа), а затем становятся полезными такие методы, как кэширование и сопоставление памяти.
Как бороться с ошибкой «java.lang.OutOfMemoryError: Java heap space»?
Учитывая эту ситуацию, как мне справиться с этим ограничением?
Я мог бы увеличить максимальный размер кучи, используя опцию командной строки для java, но это потребовало бы выяснения доступной оперативной памяти и написания некоторой запускающей программы или скрипта. Кроме того, увеличение до некоторого конечного максимума в конечном итоге не избавит от проблемы.
В конечном итоге у вас всегда есть конечный максимум кучи для использования независимо от того, на какой платформе вы работаете. В Windows 32 бит это примерно 2GB (не куча, а общий объем памяти на процесс). Просто так получается, что Java решает уменьшить размер по умолчанию (предположительно, так, чтобы программист не мог создавать программы с распределенным выделением памяти, не сталкиваясь с этой проблемой и не проверяя, что именно они делают).
Если вы решите, что вы распределяете эти объекты по какой-то причине и вам нужно хранить ссылки (в зависимости от того, что вы делаете, это может иметь место), вам просто нужно будет увеличить максимальный размер кучи при запуске программы. Однако, как только вы выполните профилирование памяти и поймете, как распределяются ваши объекты, у вас должно быть лучшее представление о том, сколько памяти вам нужно.
В общем, если вы не можете гарантировать, что ваша программа будет работать в ограниченном объеме памяти (возможно, в зависимости от размера ввода), вы всегда столкнетесь с этой проблемой. Только после исчерпания всего этого вам нужно будет изучить кэширование объектов на диск и т. Д. В этот момент у вас должна быть очень веская причина сказать «мне нужен Xgb памяти» для чего-то, и вы не сможете обойти это, улучшив ваши алгоритмы или шаблоны распределения памяти. Обычно это будет иметь место только в случае алгоритмов, работающих с большими наборами данных (например, с базой данных или какой-либо программой научного анализа), и тогда становятся полезными такие методы, как кэширование и ввод-вывод в память.
Minecraft Forums
java.lang.OutOfMemoryError: Java heap space
Hello guys, I hope you are having an excellent day.
-Go to Computer > Properties > Advanced System Settings > Advanced > Performance > Settings > Advanced > Virtual Memory > Change. >Then I uncheck the Automatically manage paging file. > Then I clicked the «C:» I checked custom size and I put on Initial size and Maximum size 5000 MB. Basically I «added» RAM to my CPU. I founded this with this video:
So after I did that I got this message: Could not create the java virtual machine
And I add a system variable with the following stuff:
Here is the video where I founded it
And I gave up and I deleted Optifine of the mods folder. I put my mods back to its folder and now I get the same problem java.lang.OutOfMemoryError: Java heap space
HERE IS THE FULL CRASH REPORT:
Time: 7/22/14 7:50 PM
Description: Registering texture
java.lang.OutOfMemoryError: Java heap space
at net.minecraft.client.renderer.texture.TextureAtlasSprite.func_147964_a(TextureAtlasSprite.java:206)
at net.minecraft.client.renderer.texture.TextureMap.func_110571_b(TextureMap.java:169)
at net.minecraft.client.renderer.texture.TextureMap.func_110551_a(TextureMap.java:90)
at net.minecraft.client.renderer.texture.TextureManager.func_110579_a(SourceFile:72)
at net.minecraft.client.renderer.texture.TextureManager.func_110580_a(SourceFile:61)
at net.minecraft.client.renderer.texture.TextureManager.func_130088_a(SourceFile:52)
at net.minecraft.client.Minecraft.func_71384_a(Minecraft.java:523)
at net.minecraft.client.Minecraft.func_99999_d(Minecraft.java:815)
at net.minecraft.client.main.Main.main(SourceFile:103)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at net.minecraft.launchwrapper.Launch.launch(Launch.java:134)
at net.minecraft.launchwrapper.Launch.main(Launch.java:28)
NullPointerException: null
Anisotropic Filtering: Off (1)
Thanks for reading.
You just did a whole bunch of unneeded stuff that will not fix your error at all. Never trust YouTube unless you actually know what you are doing (or if the creator themselves know what they are doing).
Virtual memory will do absolutely nothing to solve your issue, as the JVM is limiting memory usage it’s self, not the system. I would also advise you to read this article by Microsoft. You can revert that unnecessary page file edit.
The «_JAVA_OPTIONS» variable is a powerful Environment Variable that will run all Java applications with those parameters. You seem to have allocated 512MB also, which is useless as that is also Minecraft’s default allocation. Remove that Environment Variable, as it does not help you at all (if anything, it is forcing you to use that allocation).
After you have done all that, please remove the resource pack, and Minecraft should be able to properly function.
You just did a whole bunch of unneeded stuff that will not fix your error at all. Never trust YouTube unless you actually know what you are doing (or if the creator themselves know what they are doing).
Virtual memory will do absolutely nothing to solve your issue, as the JVM is limiting memory usage it’s self, not the system. I would also advise you to read this article by Microsoft. You can revert that unnecessary page file edit.
The «_JAVA_OPTIONS» variable is a powerful Environment Variable that will run all Java applications with those parameters. You seem to have allocated 512MB also, which is useless as that is also Minecraft’s default allocation. Remove that Environment Variable, as it does not help you at all (if anything, it is forcing you to use that allocation).
After you have done all that, please remove the resource pack, and Minecraft should be able to properly function.
But, like Extreme Heat said, your GPU is weak, so a 512×512 pack would be extremely laggy. Even a 256×256 pack would probably be laggy.
Go to http://bdcraft.net/purebdcraft-minecraft and choose a lower-resolution pack.
I have an simular issue like Mashty, experiencing it since 2 hours (worked fine before): everytime, when I try to load an 64x texture pack (Sphax PureBDcraft 64x MC17(I’ve downloaded and added textures for Buildcraft, enderstorage, Forestry, IC2 experimental, Ironchests, Logistics pipes, railcraft and «plugins for Forestry) I get following error:
Time: 18.01.15 04:57
Description: Rendering screen
java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOfRange(Unknown Source)
at java.lang.String. (Unknown Source)
at java.lang.String.substring(Unknown Source)
at java.lang.String.subSequence(Unknown Source)
at com.google.common.base.Splitter$SplittingIterator.computeNext(Splitter.java:586)
at com.google.common.base.Splitter$SplittingIterator.computeNext(Splitter.java:496)
at com.google.common.base.AbstractIterator.tryToComputeNext(AbstractIterator.java:64)
at com.google.common.base.AbstractIterator.hasNext(AbstractIterator.java:59)
at com.google.common.collect.Lists.newArrayList(Lists.java:144)
at com.google.common.collect.Iterables.toCollection(Iterables.java:319)
at com.google.common.collect.Iterables.toArray(Iterables.java:297)
at net.minecraft.client.resources.Locale.func_135021_a(SourceFile:72)
at net.minecraft.client.resources.Locale.func_135028_a(SourceFile:63)
at net.minecraft.client.resources.Locale.func_135022_a(SourceFile:35)
at net.minecraft.client.resources.LanguageManager.func_110549_a(LanguageManager.java:84)
at net.minecraft.client.resources.SimpleReloadableResourceManager.func_110544_b(SourceFile:99)
at net.minecraft.client.resources.SimpleReloadableResourceManager.func_110541_a(SourceFile:87)
at net.minecraft.client.Minecraft.func_110436_a(Minecraft.java:543)
at net.minecraft.client.resources.GuiScreenTemporaryResourcePackSelectSelectionList.func_77213_a(SourceFile:158)
at net.minecraft.client.gui.GuiSlot.func_77211_a(GuiSlot.java:247)
at net.minecraft.client.resources.GuiScreenTemporaryResourcePackSelect.func_73863_a(SourceFile:109)
at net.minecraft.client.renderer.EntityRenderer.func_78480_b(EntityRenderer.java:1153)
at net.minecraft.client.Minecraft.func_71411_J(Minecraft.java:946)
at net.minecraft.client.Minecraft.func_99999_d(Minecraft.java:838)
at net.minecraft.client.main.Main.main(SourceFile:101)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at net.minecraft.launchwrapper.Launch.launch(Launch.java:131)
at net.minecraft.launchwrapper.Launch.main(Launch.java:27)
If Important i’ll write down my system specs:
CPU: Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz
RAM: 8 GB
GPU: NVIDIA GeForce GTX 580 ( 2x, SLI )
Hopefully, you can help me with the Information provided, will post more Info if needed.
please make your own thread in the modded section as your issue may not be the same due to the number of mods you have, thisa is the unmodified section (thread hijacking is also bad)
Thread closed to stop futher necromany and hijacking
Какие бывают типы OutOfMemoryError или из каких частей состоит память java процесса
Область памяти, занимаемая java процессом, состоит из нескольких частей. Тип OutOfMemoryError зависит от того, в какой из них не хватило места.
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
Впервые я столкнулся с данной ошибкой несколько лет назад, когда занимался нагрузочным тестированием и пытался выяснить максимальное количество пользователей, которые могут работать с нашим веб-приложением. Я использовал специальную тулзу, которая позволяла логинить пользователей и эмулировать их стандартные действия. На определенном количестве клиентов, я начал получать OutOfMemoryError. Не особо вчитываясь в текст сообщения и думая, что мне не хватает памяти на создание сессии пользователя и других необходимых объектов, я увеличил размер кучи приложения (-Xmx). Каково же было мое удивление, когда после этого количество пользователей одновременно работающих с системой только уменьшилось. Давайте подробно разберемся как же такое получилось.
На самом деле это очень просто воспроизвести на windows на 32-битной машине, так как там процессу выделяется не больше 2Гб.
Более подробно, что же лежит в стеке потока, и куда уходит эта память, можно прочитать тут.
Конечно, вам может показаться данная проблема слегка надуманной, так как большинство серверов нынче крутиться на 64-битной архитектуре, но все же считаю данный пример весьма полезным, так как он помогает разобраться из каких частей состоит память java-процесса.
java.lang.OutOfMemoryError: Java heap space
I am getting the following error on execution of a multi-threading program
The above error occured in one of the threads.
Upto my knowledge, Heap space is occupied by instance variables only. If this is correct, then why this error occurred after running fine for sometime as space for instance variables are alloted at the time of object creation.
Is there any way to increase the heap space?
What changes should I made to my program so that It will grab less heap space?
12 Answers 12
However, I would recommend profiling your application to find out why your heap size is being eaten. NetBeans has a very good profiler included with it. I believe it uses the jvisualvm under the hood. With a profiler, you can try to find where many objects are being created, when objects get garbage collected, and more.
1.- Yes, but it pretty much refers to the whole memory used by your program.
2.- Yes see Java VM options
But you should see if you don’t have a memory leak first.
3.- It depends on the program. Try spot memory leaks. This question would be to hard to answer. Lately you can profile using JConsole to try to find out where your memory is going to
I have found it useful to use visualgc to watch how the different parts of the memory model is filling up, to determine what to change.
It is difficult to determine which part of memory was filled up, hence visualgc, as you may want to just change the part that is having a problem, rather than just say,
Fine! I will give 1G of RAM to the JVM.
Try to be more precise about what you are doing, in the long run you will probably find the program better for it.
To determine where the memory leak may be you can use unit tests for that, by testing what was the memory before the test, and after, and if there is too big a change then you may want to examine it, but, you need to do the check while your test is still running.
You can get your heap memory size through below programe.
That means you are creating more objects in your application over a period of time continuously. New objects will be stored in heap memory and that’s the reason for growth in heap memory.
Heap not only contains instance variables. It will store all non-primitive data types ( Objects). These objects life time may be short (method block) or long (till the object is referenced in your application)
Yes. Have a look at this oracle article for more details.
There are two parameters for setting the heap size:
-Xms:, which sets the initial and minimum heap size
-Xmx:, which sets the maximum heap size
It depends on your application.
Set the maximum heap memory as per your application requirement
Don’t cause memory leaks in your application
Important notes from oracle article
Cause: The detail message Java heap space indicates object could not be allocated in the Java heap. This error does not necessarily imply a memory leak.
On a different note, use better Garbage collection algorithms ( CMS or G1GC)
Have a look at this question for understanding G1GC


