1. 程式人生 > >JVM 記憶體洩露簡單示例

JVM 記憶體洩露簡單示例

      在文章 JVM如何判斷物件"死"和"活"中,介紹瞭如何判斷物件生存與否,其中說到了根搜尋演算法,是否與GC Roots有通路來判斷物件的生死屬性。那麼,java虛擬機發送記憶體洩露的原因是什麼呢,主要有以下兩個特點:

            (1)被分配的物件是可達的,即在有向圖中,與GC Roots是有通路的;

            (2)但該物件在以後的程式中不再使用,即物件是無用的。

      滿足了上面兩個特點,就可以判定為記憶體洩露,這些物件不會被GC回收,但仍佔用著記憶體。

      舉個簡單的例子如下:

package cn.com.yy;

import java.util.Vector;

/**
 * 簡單的記憶體洩露例子
 * @author yy
 * @time 2014-10-3 上午10:41:42
 */
public class MemoryLeakTest {

	public static void main(String[] args) {
		Vector v = new Vector(100000000);
		for(int i=0;i<v.size();i++){
			Object o = new Object();
			v.add(o);
			o = null;
		}
	}
}
      執行該程式,結果如下:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at java.util.Vector.<init>(Vector.java:131)
	at java.util.Vector.<init>(Vector.java:144)
	at cn.com.yy.MemoryLeakTest.main(MemoryLeakTest.java:13)
      解析:

              在for迴圈中,迴圈申請Object物件,每申請一個放入Vector中,然後把Object物件置空。此時,對於Object物件來說,與GC Roots是有通路的,因為由Vector物件引用,但在Object物件置空後,Object物件又沒有用途了,所以對於所有的Object物件來說,與GC Roots有通路,但是又沒有用,所以造成了堆記憶體洩露。