Объем памяти кучи Java - PullRequest
       3

Объем памяти кучи Java

0 голосов
/ 09 сентября 2010

При записи огромных данных в файл с использованием Java, как можно избежать возникновения ошибки в куче памяти Java из-за недостатка места ? .. Это вызывает некоторые сбои в моей программе ..

С уважением,

magggi

Ответы [ 5 ]

2 голосов
/ 09 сентября 2010

Ваша проблема в том, что вы используете один StringBuffer для обработки всего вашего контента.Вы должны пытаться сбрасывать ваши данные чаще.Вы получите производительность и память.

Без оригинального кода я не могу вам больше помочь, но время от времени стараюсь очищать ваш буфер.


Не рекомендуетсяв вашем случае

Если вы все еще хотите использовать свой StringBuffer и очищать его только один раз, вам придется увеличить пространство кучи с помощью опции -Xmx***M в команде java.


Ресурсы:

По той же теме:

1 голос
/ 09 сентября 2010

Из ваших комментариев кажется, что вы перебираете некоторые объекты, которые заполняют StringBuffer, и, когда вы закончите перебора, вы сбрасываете весь StringBuffer в файл.Вместо этого вы можете либо записывать напрямую в выходной поток на каждой итерации (рекомендуется), либо на каждой итерации записывать в свой StringBuffer, сбрасывать его в выходной поток и затем очищать StringBuffer для следующей итерации (не рекомендуется).Это должно снизить использование памяти.

Я не рекомендую увеличивать размер кучи - это не похоже на правильное решение этой проблемы.

0 голосов
/ 09 сентября 2010

Пара опций

  1. Увеличьте размер кучи Java с помощью параметра -Xmx JVM.После -Xmx укажите количество мегабайт, необходимое для успешной работы вашей программы.

  2. Использовать потоковую передачу.Вычислите следующие N байтов в файле и затем запишите их, используя свой FileOutputStream, выбросив их перед вычислением следующих N байтов.Чтобы узнать, будет ли это работать для вашей программы, потребуется больше кода.

Редактировать: Из того, что вы говорите, звучит так, как будто вы можете заключить FileOutputStream в BufferedOutputStream, отброситьполностью StringBuffer и просто записывать напрямую в BufferedOutputStream.

0 голосов
/ 09 сентября 2010

Пытались ли вы передать параметры памяти в приложение при его запуске?

Например, следующее устанавливает максимальный объем памяти в 1 ГБ

java -Xms512m -Xmx1024m myClass 
0 голосов
/ 09 сентября 2010

Используйте параметр -Xmx при запуске java-программы, чтобы установить максимальный размер кучи:

java -Xmx256M com.foo.MyClass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...