java heap space ошибка как исправить edeclaration
java heap space ошибка как исправить
В этой ситуации, как мне справиться с этим ограничением?
Я мог бы переписать часть своего кода, чтобы часто сохранять объекты в файловой системе (использование базы данных — то же самое), чтобы освободить память. Это может сработать, но, вероятно, это тоже много работы.
18 ответов
В конечном итоге у вас всегда есть конечный максимум кучи для использования независимо от того, на какой платформе вы работаете. В Windows 32 бит это примерно 2GB (не куча, а общий объем памяти на процесс). Просто так получается, что Java решает уменьшить размер по умолчанию (предположительно, так, чтобы программист не мог создавать программы с распределенным выделением памяти, не сталкиваясь с этой проблемой и не проверяя, что именно они делают).
Если вы решите, что вы распределяете эти объекты по какой-то причине, и вам нужно хранить ссылки (в зависимости от того, что вы делаете, это может иметь место), вам просто нужно увеличить максимальный размер кучи, когда вы запускаете программа. Однако, как только вы выполните профилирование памяти и поймете, как распределяются ваши объекты, у вас должно быть лучшее представление о том, сколько памяти вам нужно.
В общем, если вы не можете гарантировать, что ваша программа будет работать в некотором конечном объеме памяти (возможно, в зависимости от размера ввода), вы всегда столкнетесь с этой проблемой. Только после исчерпания всего этого вам нужно будет изучить кэширование объектов на диск и т. Д. В этот момент у вас должна быть очень веская причина сказать «мне нужен Xgb памяти» для чего-то, и вы не сможете обойти это, улучшив ваши алгоритмы или шаблоны распределения памяти. Как правило, это будет иметь место только в случае алгоритмов, работающих с большими наборами данных (например, с базой данных или какой-либо программой научного анализа), и тогда становятся полезными такие методы, как кэширование и ввод-вывод в память.
Я в общем склеил всю музыку, которую хотел сделать фоновой, и вышло 315мб. Закинул в проект, и попытался с помощью запустить. Но не вышло( Код метода для проигрывания музыки:
Как это исправить? Пробовал увлеичить память, но мне ошибку выбивало, то ли памяти мало, то ли ещё что-то. Всего на компе 2гб ОЗУ.
2 ответа 2
Попробуйте увеличить размер хипа для jvm. Для этого в аргументах jvm укажите:
Параметр Xmx указывает максимальный размер занимаемый хипом, а Xms — начальный размер выделенный под хип.
Как бороться с » java.ленг.Ошибка «OutOfMemoryError: Java heap space» (размер кучи 64 МБ)
учитывая эту ситуацию, как я должен бороться с этим ограничением?
я мог бы увеличить максимальный размер кучи используя командная строка опция java, но для этого потребуется выяснить доступную ОЗУ и написать некоторую программу запуска или скрипт. Кроме того, увеличение до некоторого конечного максимума в конечном итоге не избавляет от проблемы.
я мог бы переписать часть моего кода, чтобы часто сохранять объекты в файловой системе (используя базу данных то же самое), чтобы освободить память. Это может сработать, но это, вероятно, тоже много работы.
Если бы вы могли указать мне на детали вышеуказанных идей или некоторые альтернативы, такие как автоматическая виртуальная память, динамически расширяя размер кучи, это будет здорово.
18 ответов
в конечном счете у вас всегда есть конечный максимум кучи, чтобы использовать независимо от того, на какой платформе вы работаете. В Windows 32 бит это около 2 Гб (не конкретно куча, но общий объем памяти на процесс). Просто случается, что Java решает сделать значение по умолчанию меньше (предположительно, чтобы программист не мог создавать программы с неуправляемым распределением памяти, не сталкиваясь с этой проблемой и не изучая точно, что они делают).
Так это учитывая, что есть несколько подходов, которые вы можете предпринять, чтобы определить, какой объем памяти вам нужен, или уменьшить объем используемой памяти. Одной из распространенных ошибок в языках сбора мусора, таких как Java или C#, является сохранение ссылок на объекты, которые вы больше не используете, или выделение многих объектов, когда вы можете использовать их вместо этого. Пока объекты имеют ссылку на них, они будут продолжать использовать пространство кучи, поскольку сборщик мусора не удалит их.
в этом случае вы можно использовать профилировщик памяти Java, чтобы определить, какие методы в вашей программе выделяют большое количество объектов, а затем определить, есть ли способ убедиться, что они больше не ссылаются или не выделяют их в первую очередь. Один вариант, который я использовал в прошлом «СПМ» http://www.khelekore.org/jmp/.
Если вы определяете, что вы выделяете эти объекты по какой-то причине, и вам нужно сохранить ссылки (в зависимости от того, что вы делаете это возможно, это так), вам просто нужно будет увеличить максимальный размер кучи при запуске программы. Однако, как только вы сделаете профилирование памяти и поймете, как выделяются ваши объекты, вы должны иметь лучшее представление о том, сколько памяти вам нужно.
В общем, если вы не можете гарантировать, что ваша программа будет работать в некотором конечном объеме памяти (возможно, в зависимости от размера ввода), вы всегда столкнетесь с этой проблемой. Только после исчерпания всего этого вам нужно будет посмотреть в кэширование объектов на диск и т. д. На данный момент у вас должна быть очень веская причина сказать: «Мне нужен Xgb памяти» для чего-то, и вы не можете обойти это, улучшив свои алгоритмы или шаблоны выделения памяти. Как правило, это происходит только в случае алгоритмов, работающих с большими наборами данных (например, с базой данных или какой-либо программой научного анализа), а затем становятся полезными такие методы, как кэширование и сопоставление памяти.
Не могу победить java.lang.OutOfMemoryException: java heap space
Помогите с советом, как победить java.lang.OutOfMemoryException: java heap space.
Суть такова, что загружаю с формы xlsx около 9000 строк, валится как раз на методе XSSFSheet.read. Если в этом файле оставить строк 5, то все ок.
сам метод загрузки создает объект каждой строки.
Может кто-то сможешь подсказать, почему так(( На более мощной машине, где 16Гб озу и core i7 все нормально работает.
2 ответа 2
Можно считывать сразу файл XSSFWorkbook xssfWorkbook = new XSSFWorkbook(file);
Можно удалить все поля в сервисе они особо не нужны
Вынести в переменную XSSFRow xssfRow = sheet.getRow(j); выше цикла?
Вынести все переменные тем самым избежать создания лишних объектов например:
import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.openxml4j.exceptions.OLE2NotOfficeXmlFileException; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service;
import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Date; import java.util.List;
@Service public class GetListOfRatesImpl implements GetList <
keyCargo как то сложно? два раза cell.getNumericCellValue()
Кстати если хип дамп есть то в нем должно быть понятно каких объектов много и на чем можно сэкономить
Как бороться с ошибкой «java.lang.OutOfMemoryError: Java heap space»?
Учитывая эту ситуацию, как я должен справиться с этим ограничением?
Я мог бы увеличить максимальный размер кучи, используя опцию командной строки для java, но это потребовало бы выяснения доступной оперативной памяти и написания некоторой запускающей программы или скрипта. Кроме того, увеличение до некоторого конечного максимума в конечном итоге не избавит от проблемы.
Если бы вы могли указать мне на детали вышеупомянутых идей или некоторые альтернативы, такие как автоматическая виртуальная память, динамически увеличивая размер кучи, это было бы здорово.
ОТВЕТЫ
Ответ 1
В конечном итоге у вас всегда есть конечный максимум кучи для использования независимо от того, на какой платформе вы работаете. В Windows 32 бит это около 2GB (не куча, а общий объем памяти на процесс). Просто так получается, что Java решает уменьшить размер по умолчанию (предположительно, так, чтобы программист не мог создавать программы с распределенным выделением памяти, не сталкиваясь с этой проблемой и не проверяя, что именно они делают).
Поэтому, учитывая, что есть несколько подходов, которые вы можете использовать, чтобы определить, какой объем памяти вам нужен, или уменьшить объем используемой памяти. Одной из распространенных ошибок в языках сборки мусора, таких как Java или С#, является сохранение ссылок на объекты, которые вы больше не используете, или выделение множества объектов, когда вы можете использовать их повторно. Пока объекты имеют ссылку на них, они будут продолжать использовать пространство кучи, поскольку сборщик мусора не удалит их.
В этом случае вы можете использовать профилировщик памяти Java, чтобы определить, какие методы в вашей программе выделяют большое количество объектов, а затем определить, есть ли способ убедиться, что на них больше нет ссылок, или вообще не выделять их. Одним из вариантов, который я использовал в прошлом, является «JMP» http://www.khelekore.org/jmp/.
Если вы решите, что вы распределяете эти объекты по какой-то причине и вам нужно хранить ссылки (в зависимости от того, что вы делаете, это может иметь место), вам просто нужно увеличить максимальный размер кучи при запуске программы. Однако, как только вы выполните профилирование памяти и поймете, как распределяются ваши объекты, у вас должно быть лучшее представление о том, сколько памяти вам нужно.
В общем, если вы не можете гарантировать, что ваша программа будет работать в ограниченном объеме памяти (возможно, в зависимости от размера ввода), вы всегда столкнетесь с этой проблемой. Только после исчерпания всего этого вам нужно будет изучить кэширование объектов на диск и т.д. В этот момент у вас должна быть очень веская причина сказать «мне нужен Xgb памяти» для чего-то, и вы не сможете обойти это, улучшив ваши алгоритмы или шаблоны распределения памяти. Обычно это будет иметь место только в случае алгоритмов, работающих с большими наборами данных (например, с базой данных или какой-либо программой научного анализа), и тогда становятся полезными такие методы, как кэширование и ввод-вывод в память.
Ответ 2
Ответ 3
Вы можете указать для каждого проекта, сколько пространства кучи хочет ваш проект
Следующее для Eclipse Helios/Juno/Kepler:
Клик правой кнопкой мыши
затем добавьте это
Ответ 4
Увеличение размера кучи не является «исправлением», это «штукатурка», 100% временная. Он снова рухнет в другом месте. Чтобы избежать этих проблем, напишите высокопроизводительный код.
Ответ 5
Не знаю, происходит ли это с другими AV-продуктами, но, вероятно, это происходит потому, что AV-программа резервирует небольшой блок памяти в каждом адресном пространстве, тем самым предотвращая одно действительно большое выделение.
Ответ 6
Аргументы VM помогли мне в затмении. Если вы используете eclipse версии 3.4, сделайте следующее
Это должно увеличить кучу памяти для всех сборок/проектов. Приведенный выше объем памяти составляет 1 ГБ. Вы можете оптимизировать, как вы хотите.
Ответ 7
Ответ 8
Я хотел бы добавить рекомендации из статьи о проблемах оракула.
Исключение в потоке имя_потока: java.lang.OutOfMemoryError: пространство кучи Java
Подробное сообщение пространство кучи Java указывает, что объект не может быть выделен в куче Java. Эта ошибка не обязательно означает утечку памяти
Простая проблема конфигурации, когда указанный размер кучи недостаточен для приложения.
Приложение непреднамеренно хранит ссылки на объекты, что предотвращает сбор мусора.
Чрезмерное использование финализаторов.
Еще один потенциальный источник этой ошибки возникает в приложениях, которые чрезмерно используют финализаторы. Если у класса есть метод finalize, то объекты этого типа не освобождают свое пространство во время сборки мусора
После сборки мусора объекты ставятся в очередь для завершения, что происходит позже. финализаторы выполняются потоком демона, который обслуживает очередь финализации. Если поток финализатора не может идти в ногу с очередью финализации, тогда куча Java может заполниться, и этот тип исключения OutOfMemoryError будет выдан.
Один из сценариев, который может вызвать эту ситуацию, заключается в том, что приложение создает высокоприоритетные потоки, которые приводят к увеличению очереди завершения со скоростью, превышающей скорость, с которой поток финализатора обслуживает эту очередь.
Ответ 9
Выполните следующие шаги:
Откройте catalina.sh из tomcat/bin.
Изменить JAVA_OPTS на
Перезагрузите свой кот
Ответ 10
Если вам нужно отслеживать использование памяти во время выполнения, пакет java.lang.management предлагает MBeans компоненты, которые можно использовать для мониторинга пулов памяти в вашей виртуальной машине (например, пространства eden, генерации с постоянным доступом и т.д.), А также поведения сборки мусора.
Свободное пространство кучи, сообщаемое этими MBean-компонентами, будет сильно различаться в зависимости от поведения GC, особенно если ваше приложение генерирует много объектов, которые позже будут обработаны GC-ed. Один из возможных подходов заключается в мониторинге свободного пространства кучи после каждого полного GC, который вы можете использовать для принятия решения об освобождении памяти путем сохранения объектов.
В конечном итоге, лучше всего ограничить сохранение памяти по мере возможности, пока производительность остается приемлемой. Как отмечалось в предыдущем комментарии, память всегда ограничена, но в вашем приложении должна быть стратегия борьбы с исчерпанием памяти.
Ответ 11
Идея состоит в том, чтобы выполнить сборку мусора, вызвав System.gc(), который, как известно, увеличивает свободную память. Вы можете продолжать проверять это после того, как код памяти выполняет.
Ответ 12
Я столкнулся с той же проблемой от размера кучи Java.
У меня есть два решения, если вы используете Java 5 (1.5).
просто установите jdk1.6 и перейдите в настройки eclipse и установите путь jre jav1 1.6, как вы установили.
Я думаю, что это будет работать.
Ответ 13
Ответ 14
По умолчанию для разработки JVM использует небольшой размер и небольшую конфигурацию для других функций, связанных с производительностью. Но для производства вы можете настроить, например: (Кроме того, может существовать специфическая конфигурация сервера приложений) → (Если памяти все еще недостаточно для удовлетворения запроса, и куча уже достигла максимального размера, возникнет ошибка OutOfMemoryError)
Например: На платформе Linux для производственного режима предпочтительны настройки.
1. создать файл setenv.sh в папке /opt/tomcat/bin/
2. Откройте и запишите эти параметры для настройки предпочтительного режима.
3. service tomcat restart
Обратите внимание, что JVM использует больше памяти, чем просто кучу. Например, методы Java, стеки потоков и собственные дескрипторы размещаются в памяти отдельно от кучи, а также внутренних структур данных JVM.
Ответ 15
В противном случае вам понадобится средство запуска, специфичное для операционной системы, которое устанавливает необходимые аргументы.
Ответ 16
Если вы продолжаете выделять и хранить ссылки на объект, вы будете заполнять любой объем памяти, который у вас есть.
Одним из вариантов является закрытие и открытие прозрачного файла, когда они переключают вкладки (вы сохраняете только указатель на файл, а когда пользователь переключает вкладку, вы закрываете и очищаете все объекты. это замедляет изменение файла. но. ) и, возможно, хранит только 3 или 4 файла в памяти.
Ваша идея динамического расширения виртуальной памяти не решает проблему, поскольку машина ограничена в ресурсах, поэтому вы должны быть осторожны и решать проблемы с памятью (или, по крайней мере, быть осторожными с ними).
Несколько советов, которые я видел с утечками памяти:
→ Имейте в виду, что если вы положили что-то в коллекцию и впоследствии забыли об этом, у вас все еще есть сильная ссылка на нее, поэтому аннулируйте коллекцию, очистите ее или сделайте что-нибудь с ней. если нет, вы найдете утечку памяти трудно найти.
→ Возможно, использование коллекций со слабыми ссылками (weakhashmap. ) может помочь с проблемами памяти, но вы должны быть осторожны с этим, так как вы можете обнаружить, что объект, который вы ищете, был собран.
Ответ 17
Если эта проблема происходит в Wildfly 8 и JDK1.8, нам нужно указать параметры MaxMetaSpace вместо параметров PermGen.
Для получения дополнительной информации, пожалуйста, проверьте Wildfly Heap Issue
Ответ 18
Что касается NetBeans, вы можете установить максимальный размер кучи для решения проблемы.
Ответ 19
Если эта ошибка появляется внезапно. Вы должны попробовать «Чистый проект». Это будет работать
How to deal with «java.lang.OutOfMemoryError: Java heap space» error?
Given this situation, how should I deal with this constraint?
I could increase the max heap size using command line option to java, but that would require figuring out available RAM and writing some launching program or script. Besides, increasing to some finite max does not ultimately get rid of the issue.
I could rewrite some of my code to persist objects to file system frequently (using database is the same thing) to free up the memory. It could work, but it’s probably a lot work too.
If you could point me to details of above ideas or some alternatives like automatic virtual memory, extending heap size dynamically, that will be great.
27 Answers 27
Ultimately you always have a finite max of heap to use no matter what platform you are running on. In Windows 32 bit this is around 2GB (not specifically heap but total amount of memory per process). It just happens that Java chooses to make the default smaller (presumably so that the programmer can’t create programs that have runaway memory allocation without running into this problem and having to examine exactly what they are doing).
So this given there are several approaches you could take to either determine what amount of memory you need or to reduce the amount of memory you are using. One common mistake with garbage collected languages such as Java or C# is to keep around references to objects that you no longer are using, or allocating many objects when you could reuse them instead. As long as objects have a reference to them they will continue to use heap space as the garbage collector will not delete them.
In this case you can use a Java memory profiler to determine what methods in your program are allocating large number of objects and then determine if there is a way to make sure they are no longer referenced, or to not allocate them in the first place. One option which I have used in the past is «JMP» http://www.khelekore.org/jmp/.
If you determine that you are allocating these objects for a reason and you need to keep around references (depending on what you are doing this might be the case), you will just need to increase the max heap size when you start the program. However, once you do the memory profiling and understand how your objects are getting allocated you should have a better idea about how much memory you need.
In general if you can’t guarantee that your program will run in some finite amount of memory (perhaps depending on input size) you will always run into this problem. Only after exhausting all of this will you need to look into caching objects out to disk etc. At this point you should have a very good reason to say «I need Xgb of memory» for something and you can’t work around it by improving your algorithms or memory allocation patterns. Generally this will only usually be the case for algorithms operating on large datasets (like a database or some scientific analysis program) and then techniques like caching and memory mapped IO become useful.