Java技術專題之JVM你的內存泄露了嗎?

1、從一個例子開始java

  關於JVM的內存泄露,讓咱們從下面一個例子開始吧,你們來判斷一下若是按照下面這種分配方式,會不會出現內存泄露呢?eclipse

 1 import java.util.List;
 2 import java.util.Vector;
 3 
 4 public class MemoryTest {
 5     /**
 6      * @param args
 7      */
 8     public static void main(String[] args) {
 9         // TODO Auto-generated method stub
10         Vector vobj = new Vector(10);
11         for(int i=0;i<100;i++)
12         {
13             Object obj = new Object();        
14             vobj.add(obj);
15             //注意此處Java如何清除內存
16             obj = null;
17             //GC會清除這一塊內存嗎?            
18         }    
19         System.out.print("end");
20     }
21 }

以上程序不會有任何異常提示,是否是就表明沒有內存泄露了呢。若是此時i最大值設爲:100000000會怎麼樣呢?不妨本身跑一下程序,下面是我實測的結果,與具體JVM參數設置有關,各人的極限值可能不一樣。
工具

 
1 Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
2     at java.util.Arrays.copyOf(Unknown Source)
3     at java.util.Arrays.copyOf(Unknown Source)
4     at java.util.Vector.ensureCapacityHelper(Unknown Source)
5     at java.util.Vector.add(Unknown Source)
6     at MemoryTest.main(MemoryTest.java:14)
 

出現了內存泄露了吧。可是這種無限放大的方式,只能是過後發現,該出的事情已經出了,應經影響到了生產應用。因此過後檢測於事無補。咱們還須要另想辦法。spa

2、如何判斷是否出現了內存泄露日誌

  JVM虛擬機內存的結構上一篇博客已經作了說明,只要Java堆中尚有可用空間,即便泄露也不會出現問題,除非內存空間已經超出JVM內存設置。若是沒有設置內存限制,而且內存空間很大的狀況下是不會出現錯誤提示的。這就給我帶來了困擾,難道非要等內存不足,發生異常才能發現內存泄露嗎?非也。code

(1)代碼走審:技術要求較高,純經驗法,遺漏可能性較大,可操做性較強,但通常要求互相審查。orm

(2)工具一 輸出JDK的GC日誌數據:blog

  設置:JAVA_OPTS增長如下參數打開jdk的GC輸出日誌:ip

  -verbose:gc -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError 內存

(3)jmap得到運行中的JVM內存快照:

  jmap -dump:format=b,file=jmap.hprof <PID>

(4)Eclipse Memory Analyzer:專業工具就是專業; 須要導入jmap.hprof文件,連接地址附上,詳細的就很少說了,省得有作廣告之嫌。

相關文章
相關標籤/搜索