JVM 記憶體洩露簡單示例
阿新 • • 發佈:2019-01-25
在文章 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有通路,但是又沒有用,所以造成了堆記憶體洩露。