我寫了一段java代碼,在CentOS上創建500K個小文件(每個平均40K)。原來的代碼是這樣的:OutputStream.write(buf,offset,size)在Linux上有內存泄漏嗎?
package MyTest;
import java.io.*;
public class SimpleWriter {
public static void main(String[] args) {
String dir = args[0];
int fileCount = Integer.parseInt(args[1]);
String content="@#$% SDBSDGSDF ASGSDFFSAGDHFSDSAWE^@$^HNFSGQW%#@&$%^J#%@#^$#UHRGSDSDNDFE$T#@[email protected]%[email protected]^$#@YEGEQW%[email protected]%!!GSDHWET!^";
StringBuilder sb = new StringBuilder();
int count = 40 * 1024/content.length();
int remainder = (40 * 1024) % content.length();
for (int i=0; i < count; i++)
{
sb.append(content);
}
if (remainder > 0)
{
sb.append(content.substring(0, remainder));
}
byte[] buf = sb.toString().getBytes();
for (int j=0; j < fileCount; j++)
{
String path = String.format("%s%sTestFile_%d.txt", dir, File.separator, j);
try{
BufferedOutputStream fs = new BufferedOutputStream(new FileOutputStream(path));
fs.write(buf);
fs.close();
}
catch(FileNotFoundException fe)
{
System.out.printf("Hit filenot found exception %s", fe.getMessage());
}
catch(IOException ie)
{
System.out.printf("Hit IO exception %s", ie.getMessage());
}
}
}
}
您可以通過以下問題命令來運行這個: Java的罐子SimpleWriter.jar my_test_dir 500000
我認爲這是一個簡單的代碼,但後來我意識到,這代碼使用高達14G的內存。我知道,因爲當我使用-m來檢查內存時,可用內存一直在下降,直到我的15G內存虛擬機只剩下70 MB可用內存。我使用Eclipse進行編譯,然後根據JDK 1.6和JDK1.7進行編譯。結果是一樣的。有趣的是,如果我註釋掉fs.write(),只需打開並關閉流,內存就會穩定在某個點。一旦我把fs.write()放回去,內存分配就會變得瘋狂。 500K 40KB文件大約20G。看起來Java的流編寫器從不在操作過程中釋放它的緩衝區。
我曾經認爲java GC沒有時間清理。但是這是沒有意義的,因爲我關閉了每個文件的文件流。我甚至將我的代碼轉移到C#中,並在windows下運行,生成的500K 40KB文件的相同代碼在某些時刻保持穩定,而不是在CentOS下使用14G。至少C#的行爲是我所期望的,但我不相信Java以這種方式執行。我問我在java中有經驗的同事。他們在代碼中看不到任何錯誤,但無法解釋爲什麼會發生這種情況。他們承認沒有人曾經試圖在一個循環中不停地創建500K文件。
我也在網上搜索,大家都說唯一需要注意的就是關閉流,我做了。
任何人都可以幫我弄清楚有什麼問題嗎?
任何人都可以試試這個,告訴我你看到了什麼嗎?
順便說一句,在這個社區的一些人試圖在Windows上的代碼,它似乎工作正常。我沒有在Windows上試過。我只在Linux中嘗試,因爲我認爲人們使用Java的地方。所以,似乎這個問題發生在Linux上)。
我也做了以下限制JVM堆,卻拿不出效果 的java -Xmx2048m -jar SimpleWriter.jar my_test_dir 500000
「代碼是這樣的」 - 你的意思是你寫了一些類似於你的代碼併發布的代碼,或者這是你實際代碼中的代碼片段嗎?如果這不是你的實際代碼,是否運行這會導致14 GB的內存消耗? – user2357112
奇怪。你以後不會碰到這些文件,是嗎? – user2357112
這是一個內存中的文件系統嗎? – user2357112