我構建了一個示例程序,演示了java中的內存泄漏。是內存泄漏嗎?
public class MemoryLeakTest {
static int depth = 0;
int number=0;
MemoryLeakTest mobj;
MemoryLeakTest(){
number = depth;
if(depth < 6500){
depth++;
mobj = new MemoryLeakTest();
}
}
protected void finalize(){
System.out.println(number + " released.");
}
public static void main(String[] args) {
try{
System.out.println(ManagementFactory.getMemoryMXBean().getHeapMemoryUsage());
System.out.println("Free Memory in starting "+ Runtime.getRuntime().freeMemory());
MemoryLeakTest testObj = new MemoryLeakTest();
System.out.println("Free Memory in end "+ Runtime.getRuntime().freeMemory());
System.out.println(ManagementFactory.getMemoryMXBean().getHeapMemoryUsage());
}
catch(Exception exp){}
finally{
System.out.println("Free Memory"+ Runtime.getRuntime().freeMemory());
System.out.println(ManagementFactory.getMemoryMXBean().getHeapMemoryUsage());
}
}
}
我通過在if(depth < N)
中更改N的值來運行它。這是結果;
當深度是1000
INIT = 16777216使用(16384K)= 288808(282K)致力於= 16252928(15872K)最大= 259522560(253440K) 可用內存在端15964120開始15964120 可用內存使用的初始值= 16777216(16384K)= 288808(282K)= 16252928(15872K)max =使用= 12877816(16384K)= 288808 259522560(253440K)
當深度是1500
INIT = 16777216使用(16384K)= 288808(282K)致力於= 16252928(15872K)最大= 259522560(253440K) 可用內存在開始15964120 在端可用內存15964120 INIT = 16777216 (16384K)使用的= 37470K(370K)= 16252928(15872K)最大= 259522560(253440K)
深度爲6000時
INIT =使用16777216(16384K)= 288808(282K)致力於= 16252928(15872K)最大= 259522560(253440K) 可用內存在開始15964120 在端可用內存15692784 INIT = 16777216使用(16384K)= 560144(547K )致力於= 16252928(15872K)最大= 259522560(253440K) 可用內存15692784 INIT = 16777216使用(16384K)= 560144(547K)致力於= 16252928(15872K)最大= 259522560(253440K)
當深度是6500(線程「main」java.lang.StackOverflowError中的異常)
init = 16777216(16384K)used = 288808(282K )提交= 16252928(15872K)max = 259522560(253440K) 啓動時的空閒內存15964120 空閒內存最後15676656 init = 16777216(16384K)used = 576272(562K)committed = 16252928(15872K)max = 259522560(253440K)
我的問題是;
- 它沒有調用finalize()。它是內存泄漏嗎?
- 自由內存不超過N = 1000。但是當N = 1500時,在程序結束時有兩個不同的 值,即282K和370K。 這是爲什麼呢?
- 當N = 6500時,JVM產生錯誤。那麼爲什麼最後2 try {}的語句被執行。
** **的觀察,我發現,JVM開始釋放記憶,當我創造大量的對象,如1-2十萬。這意味着它不是內存泄漏,但GC在實際需要時開始釋放內存。而且,它首先釋放堆上的對象頂部,就像它先釋放對象9000然後8999然後釋放8998.有趣的是。 – 2012-04-26 00:53:44
觀察2:即使在運行GC之後,getHeapMemoryUsage也會給出更高的使用空間。 – 2012-04-26 00:54:51
你可以看到http://stackoverflow.com/questions/6470651/creating-a-memory-leak-with-java:對於Java中的內存泄漏非常有用! – Val 2012-06-16 13:02:26