次のように単純でシンプルな単純なコードを使用してメモリリークが発生しています。 このコードは、ソースからファイルを取得し、各ファイルを使用して何かを実行し続けることを目的としています。 この単純なコードは、常に同じファイルを使用しますが、動作は変更されません。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の例外をスローするための正当な理由を見ることができません。
もっと
何か
問題はアップデート23のJava Development Kitバージョン6を使用して発生するが、それはJRE 1.7
正確には*この*スニペットでOOMエラーが生成され、OOMはコメント付きの「読み込みバイトで何かする」部分には関係しません。例外も例外ではありませんか? –
@Andreas_D、スニペットの分析に興味はありません。これは完全に間違ってファイルを読む方法です。 –
@Vladimir:IMHO、あなたはあなたの方法を強制するのではなく、OPによって投稿された質問を尊重する必要があります。そして、それは間違ったやり方ではなく、ちょうど回り道です。 –