(8) 一個死迴圈一直不停的new物件過程中的垃圾回收的情況
阿新 • • 發佈:2019-01-01
----------------------------------------------------------------------------------------------------------------
1.這段程式長期執行會有什麼結果? (以為執行久了會OOM 但是不會)
(沒有配置-Xms -Xmx 預設)
程式中第一次new的物件在第二次new的時候失去引用
( 垃圾回收 回收到根節點沒有引用路徑的物件)
沒影響, gc會自動回收。啟用jconsole.exe程式檢測程式執行得到
記憶體溢位 out of memory,是指程式在申請記憶體時,沒有足夠的記憶體空間供其使用,
----------------------------------------------------------------------------------------------------------------
2. (沒有配置-Xms -Xmx 預設) while(true){for (int i = 0; i < 290; i++) {
Map map = new HashMap();
}
System.out.println("do ="+ ++a);
/*try {
Thread.sleep(60000);
} catch (InterruptedException e) {
e.printStackTrace();
}*/
}
----------------------------------------------------------------------------------------------------------------
2.的基礎上加上 限制堆記憶體大小 128-256 程式執行ok
堆記憶體大小 50-50 程式執行ok
堆記憶體大小 10-20 程式執行ok
堆記憶體大小 5-5 程式執行出問題:
do =340889Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at com.test.alljava.HelloWorld.main(HelloWorld.java:20)
----------------------------------------------------------------------------------------------------------------
//所有的map都存進list<span style="white-space:pre"> </span>List list= new ArrayList();
while(true){
for (int i = 0; i < 50; i++) {
Map map = new HashMap();
list.add(map);
}
System.out.println("do ="+ ++a+"~~~~~~~~~"+list.size());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
沒有GC,直線上漲
最終導致:
堆記憶體大小 10-20 程式執行ok