При написании больших объемов данных в файл с помощью Java, как можно избежать куч памяти Java из пространства ошибки из встречающихся? .. Это вызывает некоторые сбои в моей программе ..емкость динамической памяти Java
С уважением ,
magggi
При написании больших объемов данных в файл с помощью Java, как можно избежать куч памяти Java из пространства ошибки из встречающихся? .. Это вызывает некоторые сбои в моей программе ..емкость динамической памяти Java
С уважением ,
magggi
Используйте параметр -Xmx при запуске программы Java, чтобы установить максимальный размер кучи:
java -Xmx256M com.foo.MyClass
Если файл такой огромный, выделение большего объема памяти - это не лучший способ справиться с этим. –
Обратите внимание, что исходное утверждение было довольно расплывчатым. Я склонен давать короткие и простые ответы, когда контекст не определен. Даже не упоминалось, что он может изменить программу. Я заметил, что StackOverflowers всегда предпочитают «самое чистое» решение (без учета сложности) по простому, прямолинейному, но немасштабируемому/медленному/иногда-неправильному решению. Когда контекст вопроса не определен, возможно, я должен всегда давать 2 ответа: взлом и хорошая практика. – gawi
Пробовал ли вы передавать параметры памяти в приложение при запуске?
Например, следующее устанавливает максимальный объем памяти до 1 Гб
java -Xms512m -Xmx1024m myClass
Ваша проблема заключается в том, что вы используете один StringBuffer для обработки всего содержимого. Вы должны чаще пытаться обновлять свои данные. Вы получите производительность и память.
Без исходного кода я больше не могу помочь вам, но время от времени пытайтесь сбрасывать буфер.
Не рекомендуется в вашем случае
Если вы все еще хотите использовать StringBuffer и промойте его только один раз, то вам придется увеличить пространство кучи с -Xmx***M
опции по команде java
,
Ресурсы:
На эту же тему:
Несколько вариантов
Увеличение Java Heap Size с помощью параметра -Xmx JVM. После -Xmx напишите количество мегабайт, которые ваша программа должна успешно выполнить.
Использование Streaming. Вычислите следующие N байтов в файле, а затем напишите их, используя свой FileOutputStream, выбросив их перед вычислением следующих N байтов. Дополнительный код будет необходим, чтобы узнать, как и как это будет работать для вашей программы.
Edit: Из того, что вы говорите, это звучит, как вы могли бы обернуть FileOutputStream в BufferedOutputStream, падение StringBuffer целиком и просто написать непосредственно в BufferedOutputStream.
Из ваших комментариев это звучит так, как будто вы повторяете некоторые объекты, которые заполняют StringBuffer, и после того, как вы закончите итерацию, вы очищаете весь StringBuffer до файла. Вместо этого вы можете либо напрямую писать в выходной поток на каждой итерации (рекомендуется), либо на каждой итерации писать в свой StringBuffer, очищать его до выходного потока, а затем очищать StringBuffer для следующей итерации (не рекомендуется). Это должно снизить использование памяти.
Я не рекомендую увеличивать размер кучи - это не похоже на правильное решение этой проблемы.
Оставьте ваш код, мы сможем помочь вам исправить его. –
Я в основном добавляю весь свой контент в строковый буфер, а затем, наконец, пишу и флеши. Это, когда содержимое данных является огромным результатом в памяти кучи из-за ошибки в пространстве – Magggi
Можете ли вы написать в свой поток файлов при создании контента? Другими словами, вместо добавления к строке вы можете просто написать в выходной поток? Это типичное решение - вы не хотите использовать много памяти, если не будете абсолютно необходимы. – dlongley