Jvm知識學習(三)-常用JVM配置參數

    一,Trace跟蹤參數 
   -verbose:gc
  -XX:+printGC
  可以打印GC的簡要信息
  [GC 4790K->374K(15872K), 0.0001606 secs]
  [GC 4790K->374K(15872K), 0.0001474 secs]
  [GC 4790K->374K(15872K), 0.0001563 secs] 
  [GC 4790K->374K(15872K), 0.0001682 secs]

  -XX:+PrintGCDetails
  打印GC詳細信息
  -XX:+PrintGCTimeStamps
  打印CG發生的時間戳
   [GC[DefNew: 4416K->0K(4928K), 0.0001897 secs] 4790K->374K(15872K), 0.0002232 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

-  Xloggc:log/gc.log 
指  定GC log的位置,以文件輸出
   幫助開發人員分析問題

  -XX:+PrintHeapAtGC 
-  每次一次GC後,都打印堆信息

 -XX:+TraceClassLoading
  監控類的加載
   [Loaded java.lang.Object from shared objects file]
   [Loaded java.io.Serializable from shared objects file]
   [Loaded java.lang.Comparable from shared objects file]
   [Loaded java.lang.CharSequence from shared objects file]
   [Loaded java.lang.String from shared objects file]
   [Loaded java.lang.reflect.GenericDeclaration from shared objects file]
   [Loaded java.lang.reflect.Type from shared objects file]
 
  -XX:+PrintClassHistogram
  –按下Ctrl+Break後,打印類的信息:

–分別顯示:序號、實例數量、總大小、類型
   
   二,堆的分配參數

   -Xmx –Xms
   指定最大堆和最小堆
  -Xmn
  設置新生代大小
  -XX:NewRatio
  新生代(eden+2*s)和老年代(不包含永久區)的比值
  4 表示 新生代:老年代=1:4,即年輕代佔堆的1/5
  -XX:SurvivorRatio
  設置兩個Survivor區和eden的比
  8表示 兩個Survivor :eden=2:8,即一個Survivor佔年輕代的1/10
 
  例1:

     -Xmx20m -Xms20m -Xmn1m  -XX:+PrintGCDetails

     -1,沒有觸發GC

     -2,全部分配在老年代

     例2:

     -Xmx20m -Xms20m -Xmn15m  -XX:+PrintGCDetails

    1.沒有觸發GC
    2.部分配在eden
    3.老年代沒有使用
  
     例3:

     -Xmx20m -Xms20m –Xmn7m-XX:+PrintGCDetails

     1.進行了2次新生代GC

     2.s0 s1 太小要老年代擔保

     
     例4:

     -Xmx20m -Xms20m -Xmn7m   -XX:SurvivorRatio=2 -XX:+PrintGCDetails

     
     例5:

     -Xmx20m -Xms20m -XX:NewRatio=1  

     -XX:SurvivorRatio=3 -XX:+PrintGCDetails

     
     -XX:+HeapDumpOnOutOfMemoryError
     OOM時導出堆到文件
     -XX:+HeapDumpPath
     導出OOM的路徑
     -Xmx20m -Xms5m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/a.dump
      Vector v=new Vector();
        for(int i=0;i<25;i++)
            v.add(new byte[1*1024*1024]);
      

    -XX:OnOutOfMemoryError
     在OOM時,執行一個腳本
     "-XX:OnOutOfMemoryError=D:/tools/jdk1.7_40/bin/printstack.bat %p“
      當程序OOM時,在D:/a.txt中將會生成線程的dump
可   以在OOM時,發送郵件,甚至是重啓程序

  總結:
  根據實際事情調整新生代和倖存代的大小
  官方推薦新生代佔堆的3/8
  倖存代佔新生代的1/10 
  在OOM時,記得Dump出堆,確保可以排查現場問題
  
  永久區參數分配:
  -XX:PermSize -XX:MaxPermSize
  設置永久區的初始空間和最大空間
   他們表示,一個系統可以容納多少個類型
  

三,棧的分配參數
-Xss
通常只有幾百K
決定了函數調用的深度
每個線程都有獨立的棧空間
局部變量、參數 分配在棧上

示例:棧內存,分配越大,遞歸調用的次數越多(跟函數的局部變量佔用的內存也有關係)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章