ファイルのコンテンツを読み取り、それを圧縮して小さな .tar.gz ファイルに書き込むデーモン プログラムがあります。
なんらかの理由で、すべての使用済みメモリを解放した (または解放したと思われる) 後でも、Java はメモリを割り当て続けます。私のコード/推論の何が問題になっていますか?
FileOutputStream fos = null;
GZIPOutputStream gzipos = null;
OutputStreamWriter osw = null;
BufferedWriter bw = null;
while (true) {
if (f.length() != 0) {
if (outputfile == null) {
outputfile = outputfileroot + "_" + outputPart + ".tar.gz";
fos = new FileOutputStream(outputfile);
gzipos = new GZIPOutputStream(fos);
osw = new OutputStreamWriter(gzipos);
bw = new BufferedWriter(osw);
}
else if (new File(outputfile).length() > maxLengthOutputFile) {
bw.flush();
osw.flush();
gzipos.flush();
fos.flush();
bw.close();
osw.close();
gzipos.close();
fos.close();
bw = null;
osw = null;
gzipos = null;
fos = null;
System.gc();
System.out.println("Finished writing " + outputfileroot + "_" + outputPart + ".tar.gz");
outputfile = outputfileroot + "_" + ++outputPart + ".tar.gz";
fos = new FileOutputStream(outputfile);
gzipos = new GZIPOutputStream(fos);
osw = new OutputStreamWriter(gzipos);
bw = new BufferedWriter(osw);
}
/**
* Read the entire file
*/
BufferedReader br = new BufferedReader(new FileReader(f));
String line;
while ((line = br.readLine()) != null) {
// will send the content to another thread, so I need to read it line by line
bw.write(line + "\r\n");
}
br.close();
br = null;
bw.flush();
/**
* Empty it
*/
FileWriter fw = new FileWriter(f);
fw.write("");
fw.flush();
fw.close();
fw = null;
}
Thread.sleep(1000);
}