我們正在面對一個簡單,簡單,簡單的代碼如下所示的內存泄漏。 該代碼旨在從源獲取文件,使用每個文件做一些事情並繼續。 這個簡單的代碼總是使用相同的文件,但行爲不變。現在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開發套件版本6更新23,但它不會對JRE 1.7
我是否正確 - 正確* this * snippet創建了一個OOM錯誤,OOM與註釋的「使用讀取字節做某事」部分沒有關係?沒有例外被拋出? – 2011-02-02 09:24:32
@Andreas_D,沒有興趣分析片段。這是完全錯誤的閱讀文件的方式。 – 2011-02-02 09:25:53
@Vladimir:恕我直言,你需要尊重OP發佈的問題,而不是強迫你通過。順便說一句,這不是一個錯誤的方式,它只是一種循環方式。 – 2011-02-02 09:30:45