1. 程式人生 > >(8) 一個死迴圈一直不停的new物件過程中的垃圾回收的情況

(8) 一個死迴圈一直不停的new物件過程中的垃圾回收的情況

----------------------------------------------------------------------------------------------------------------

1.這段程式長期執行會有什麼結果?  (以為執行久了會OOM 但是不會)   (沒有配置-Xms -Xmx 預設)

程式中第一次new的物件在第二次new的時候失去引用  

 ( 垃圾回收 回收到根節點沒有引用路徑的物件)

 沒影響, gc會自動回收。啟用jconsole.exe程式檢測程式執行得到

記憶體溢位 out of memory,是指程式在申請記憶體時,沒有足夠的記憶體空間供其使用,
記憶體洩露 memory leak,是指程式在申請記憶體後,無法釋放已申請的記憶體空間,一次記憶體洩露危害可以忽略,但記憶體洩露堆積後果很嚴重,無論多少記憶體,遲早會被佔光。 

----------------------------------------------------------------------------------------------------------------

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 =340889
Exception 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