#java #file-io #out-of-memory #heap-memory
#java #file-io #нехватка памяти #куча-память
Вопрос:
Я пытаюсь записать файл с некоторым объемом данных, используя это:
public static <T extends SomeClass> void writeFile(String buffer, Class<T> clazz, int fileNumber) {
String fileType = ".txt";
File file = new File(clazz.getName() fileNumber fileType);
PrintWriter printWriter = null;
try {
FileWriter writer = new FileWriter(file);
printWriter = new PrintWriter(writer);
printWriter.print(buffer);//error occurs here
printWriter.flush();
printWriter.close();
System.out.println("created file: " file.getName());
} catch (IOException e) {
e.printStackTrace();
} finally{
if(printWriter!=null){
printWriter.flush();
printWriter.close();
}
}
System.out.println("Done!");
}
Строка буфера содержит -6 МБ данных, и когда я запускаю код, я получаю java.lang.OutOfMemoryError точно в буфер.
Комментарии:
1. Предоставили ли вы вашей виртуальной машине Java разумный объем памяти с помощью опции командной строки -Xmx?
2. Вы пробовали записывать буфер меньшими блоками вместо одного вызова?
3. Кстати, я считаю, что причина, по которой PrintWriter.write использует память, заключается в том, что он кодирует всю строку в массив байтов, а затем записывает это.
Ответ №1:
Как насчет замены printWriter.print(buffer);
на:
for (int i = 0; i < buffer.length; i = 100) {
int end = i 100;
if (end >= buffer.length) {
end = buffer.length;
}
printWriter.print(buffer.substring(i, end);
printWriter.flush();
}
Комментарии:
1. Программисты в наши дни привыкли к тому, что у них так много памяти, что они никогда не думают о ее сохранении. Жизнь — это баланс.
2. @Thom: согласен с вами, но баланс означает правильное использование максимально возможного ресурса. 😉
3. Баланс означает правильное использование ресурсов.
Ответ №2:
Поскольку 6 МБ — это не так много «данных», я думаю, вам следует увеличить объем памяти виртуальной машины Java,
посмотрите здесь
http://confluence.atlassian.com/display/DOC/Fix Out of Memory Errors by Increasing Available Memory