Мы сталкиваемся с утечкой памяти, используя простой, простой и простой код следующим образом. Код предназначен для получения файлов из источника, используйте каждый файл, чтобы что-то сделать, и продолжайте. Этот простой код всегда использует один и тот же файл, но поведение не изменилось.Утечка памяти FileInputStream в цикле считывания файла
package it.datapump.main;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
public class TifReader {
public static void main (final String[] a){
for (int i = 0; i < 100000; i++) {
try {
getBytesFromFile(new File("test.tif"));
Thread.sleep(1000);
System.gc() ;
} catch (Exception ex) {
}
}
}
public static byte[] getBytesFromFile(File file) throws IOException {
InputStream is = new FileInputStream(file);
long length = file.length();
byte[] bytes = new byte[(int)length];
int offset = 0;
int numRead = 0;
while (offset < bytes.length
&& (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
offset += numRead;
}
is.close();
// Do something with the read bytes
//
if (offset < bytes.length) {
throw new IOException("Could not completely read file "+file.getName());
}
return bytes;
}
}
Теперь ... мы просто не можем видеть действительную причину этого кода, чтобы потреблять память до самого верха, и в конце концов бросает исключение OutOfMemoryError.
Есть идеи?
нечто большее
Проблема возникает с помощью Java Development Kit Version 6 Update 23, но это не на JRE 1.7
Правильно ли это - этот * фрагмент создает ошибку OOM, OOM не связан с частью комментария «Делать что-нибудь с прочитанными байтами»? И никаких исключений не бросали? –
@Andreas_D, не заинтересован в анализе фрагмента. Это абсолютно неправильный способ чтения файла. –
@Vladimir: IMHO, вам нужно уважать вопрос, поставленный OP, а не прокладывать себе путь. И BTW, это не «неправильно», это просто «круглый» способ. –