JVM--心得 堆棧地區和GC的設定,jvm--心得堆棧gc

來源:互聯網
上載者:User

JVM--心得 堆棧地區和GC的設定,jvm--心得堆棧gc

簡單記錄JVM儲存空間的幾大模組的常用名稱;使用哪些參數對各個模組進行尺寸設定及記憶體回收;最後舉例子說明下參數配置後的GC的效果。

第一步,首先對於儲存的幾大模組進行一下簡單描述:
    1)JVM的記憶體分為兩塊:A.堆heap B.非堆non-heap:即堆以外的棧、方法區、常量池、寄存器空間(稱為PermanateGeneration持久代)
    2)然後堆heap分為YongGeneration年輕代,TenuringGeneration年老代。
    3) YongGeneration又分為Eden區,Survivor區(Survivor有兩個區)
    各個地區的作用,可以參看“JVM--心得概念”隨筆裡的記述內容。日常使用時,主要關注Heap這一最大的記憶體空間。持久代主要儲存中繼資料和待用資料,不用過多的定製。

 第二步,針對空間分配和記憶體回收引入如下參數的設定(使用Eclipse時,可以通過exclipse.ini檔案或者設定的JRE預設參數設定。tomcat時catalina裡可以設定。直接用JRE時,通過控制台命令進行設定。)

     主要參數:
     1)空間大小相關的設定:
     -Xmx 該參數規定了JVM堆的最大記憶體空間。例子:-Xmx512M
     -Xms 該參數規定了JVM堆的初始記憶體尺寸。例子:-Xmx512M
          當堆的使用>=堆空間當前空間的60%時,JVM會增大當前堆的記憶體空間,最大為-Xmx。
          當堆的使用<=堆空間當前空間的30%時,JVM會減少當前堆的記憶體空間,最小為-Xms。
          為了避免GC後頻繁調整當前堆空間的大小,所以可以把-Xmx和-Xms設定為相同的值。
     -Xmn 該參數規定了年輕代的空間。即Eden和兩個Survivor的地區總空間。例子:-Xmn128M。官方推薦該尺寸設定為堆空間的3/8。
     -Xss 該參數規定了單線程Java棧的大小。理論上該參數越小,可以使用的Java線程越多,實際情況線程不會無限多。例子:-Xss1M或者Xss128K
     -XX:MaxPermSize 該參數規定了持久代的最大空間。例子:-XX:MaxPermSize=64M
     

     2)空間比率劃分的設定:
     -XX:NewRatio 該參數規定了年輕代和年老代的比率。當-XX:NewRatio=4時,代表的含義為 年輕代:年老代=1:4
     -XX:SurvivorRatio 該參數規定了Servior和Eden的比率。當-XX:SurvivorRatio=4時,代表的含義為 Servier:Eden=2:4。
     因為Survivor有兩個地區,所以這裡是2:4。可以當成Survivor是雙胞胎,打架一起上。
     

     3)GC有關的參數:
     -XX:+UseParNewGC 聲明了年輕代使用並行收集策略。(還有UseSerialGC串列GC策略,適合單線程程式,伺服器應用很少使用)
     -XX:+UseConcMarkSweepGC 聲明了年老代使用並發收集策略(簡稱CMS,GC日誌中經常出現該單詞)。並發收集策略比較注重回收的效率,減少程式暫停時間。
     -XX:ParallelGCTheads 聲明了並發回收時,參與工作的線程數量。一般和處理器的個數相等。例子:-XX:ParallelGCTheads=4
     -XX:CMSInitiatingOccupancyFraction 聲明了當年老代的使用率超過該比率時,對年老代進行GC。避免年老代空間不足引發FullGC。

         例子:- XX:CMSInitiatingOccupancyFraction=60
    -XX:CMSFullGCsBeforeCompaction 聲明了當發生了一定次數的FullGc後實施記憶體的磁碟重組。比如當發生ParNew即年輕代的GC時,不一定是空餘空間不足,
    可能由於記憶體的片段導致連續的可用記憶體空間不足。實施磁碟重組本身會佔用效能,整理的頻率需要按實際情況設定。例子 -XX:CMSFullGCsBeforeCompaction=4
    說名:上述設定主要是面向並發回收策略中的常用參數。還有其他的策略參數(如並行回收策略)請參看官方文檔。
    

    4)GC的資訊查看
    -XX:+PrintGC 聲明了列印GC資訊
    -XX:+PrintGCDetails 聲明了列印GC的詳細資料
    -Xloggc 聲明了把GC的資訊出力到指定檔案中。例子:-Xloggc:D:\work\chongpf\workspace\skillDoc\JVM\Capter3_parameter\jvmgc.log

第三步,實際應用測試一下。
    1)配置:本例按eclipse舉例。通過視窗->設定->Java->安裝的JRE->選擇目前的JRE,並按編輯按鈕->預設的JVM參數裡輸入如下內容(填入時,不要換行):
    -Xmx512M -Xms512M -Xmn128M -Xss1M -XX:NewRatio=3 -XX:SurvivorRatio=2 -XX:PermSize=64M -XX:MaxPermSize=64M -XX:+UseParNewGC -    XX:+UseConcMarkSweepGC -XX:ParallelGCThreads=4 -XX:CMSInitiatingOccupancyFraction=20 -XX:CMSFullGCsBeforeCompaction=4 -XX:+PrintGC -XX:+PrintGCDetails -j    avaagent:D:\work\chongpengfei\src\outlib\sizeOf.jar -Xloggc:D:\work\chongpengfei\workspace\skillDoc\JVM\Capter3_parameter\jvmgc.log

    另外,調試時為了方便查看對象的尺寸,工程裡引入了SizeOf的jar包。並把該jar設定到了Jvm的啟動參數中。
    下載路徑:https://sourceforge.net/projects/sizeof/

    2)代碼如下:
-------------------------------------------------------------------------------
package com.chong.studyparalell.jvm.heap;

import java.util.Date;
import net.sourceforge.sizeof.SizeOf;

public class HeapDemo {

public static void main(String [] args){
HeapDemo demo = new HeapDemo();
demo.testJVMParamAndGC();
}

private void testJVMParamAndGC(){

for(int i=0;i<1000;i++){

//每次產生一個4M的數組,測試Eden地區和Survivior地區,即:new generation
int[] temp = new int[1*1024*1024];
System.out.println(new Date().toString()+ " pintSize:" + SizeOf.humanReadable(SizeOf.deepSizeOf(temp)));

// 每迴圈100次,建立一個80M大小的數組引發CMS GC使用,即 tenuringGeneration
if(i%100==0 && i>0){
int[] intArr = new int[20*1024*1024];
System.out.println(new Date().toString()+ " pintSize:" + SizeOf.humanReadable(SizeOf.deepSizeOf(intArr)));
}
}

//最後測試一下FullGC
System.gc();
}
}
-------------------------------------------------------------------------------
控制台的部分訊息:
Found big object: [I@20995753 size: 4.0000152587890625Mb
Fri Oct 13 18:20:25 CST 2017 pintSize:4.0000152587890625Mb
Found big object: [I@8947790 size: 4.0000152587890625Mb
Fri Oct 13 18:20:25 CST 2017 pintSize:4.0000152587890625Mb
Found big object: [I@28106261 size: 4.0000152587890625Mb
Fri Oct 13 18:20:25 CST 2017 pintSize:4.0000152587890625Mb
Found big object: [I@2651170 size: 4.0000152587890625Mb
Fri Oct 13 18:20:25 CST 2017 pintSize:4.0000152587890625Mb
Found big object: [I@31485310 size: 4.0000152587890625Mb
Fri Oct 13 18:20:25 CST 2017 pintSize:4.0000152587890625Mb
=>取到了1*1024*1024數組的大小為4M。
-------------------------------------------------------------------------------
GClog的部分內容如下:
0.298: [GC 0.298: [ParNew: 65375K->711K(98304K), 0.0050990 secs] 65375K->711K(491520K), 0.0051687 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]
0.316: [GC 0.316: [ParNew: 64144K->895K(98304K), 0.0045324 secs] 64144K->895K(491520K), 0.0045901 secs] [Times: user=0.05 sys=0.00, real=0.00 secs]
0.332: [GC 0.332: [ParNew: 63451K->917K(98304K), 0.0029476 secs] 63451K->917K(491520K), 0.0030049 secs] [Times: user=0.06 sys=0.00, real=0.00 secs]
0.346: [GC 0.346: [ParNew: 62652K->999K(98304K), 0.0030507 secs] 62652K->999K(491520K), 0.0031118 secs] [Times: user=0.05 sys=0.02, real=0.00 secs]
0.360: [GC 0.360: [ParNew: 63073K->1020K(98304K), 0.0045439 secs] 63073K->1020K(491520K), 0.0046042 secs] [Times: user=0.05 sys=0.00, real=0.00 secs]
0.373: [GC 0.373: [ParNew: 62588K->1025K(98304K), 0.0039508 secs] 62588K->1025K(491520K), 0.0040171 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
0.432: [GC 0.432: [ParNew: 62550K->1027K(98304K), 0.0038388 secs] 144470K->82947K(491520K), 0.0038931 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
0.436: [GC [1 CMS-initial-mark: 81920K(393216K)] 87043K(491520K), 0.0006483 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
0.437: [CMS-concurrent-mark-start]
0.452: [GC 0.452: [ParNew: 62577K->1027K(98304K), 0.0035159 secs] 144497K->82947K(491520K), 0.0035706 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
0.461: [CMS-concurrent-mark: 0.020/0.024 secs] [Times: user=0.05 sys=0.02, real=0.02 secs]
0.461: [CMS-concurrent-preclean-start]
0.462: [CMS-concurrent-preclean: 0.001/0.001 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
0.462: [CMS-concurrent-abortable-preclean-start]
0.465: [GC 0.465: [ParNew: 62541K->1027K(98304K), 0.0029296 secs] 144461K->82947K(491520K), 0.0029711 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
0.477: [GC 0.477: [ParNew: 62830K->1027K(98304K), 0.0029403 secs] 144750K->82947K(491520K), 0.0029839 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
0.480: [CMS-concurrent-abortable-preclean: 0.011/0.018 secs] [Times: user=0.03 sys=0.00, real=0.02 secs]
0.481: [GC[YG occupancy: 5123 K (98304 K)]0.481: [Rescan (parallel) , 0.0012978 secs]0.482: [weak refs processing, 0.0000056 secs]0.482: [scrub string table, 0.0000582 secs] [1 CMS-remark: 81920K(393216K)] 87043K(491520K), 0.0014650 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
0.482: [CMS-concurrent-sweep-start]
0.482: [CMS-concurrent-sweep: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
0.482: [CMS-concurrent-reset-start]
0.485: [CMS-concurrent-reset: 0.003/0.003 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
中間省略
1.187: [GC 1.187: [ParNew: 41003K->4096K(98304K), 0.0033611 secs]1.191: [CMS1.191: [CMS-concurrent-abortable-preclean: 0.006/0.053 secs] [Times: user=0.12 sys=0.00, real=0.05 secs]
(concurrent mode failure) (concurrent mode failure)[YG occupancy: 4096 K (98304 K)]1.191: [Rescan (parallel) , 0.0004875 secs]1.191: [weak refs processing, 0.0000038 secs]1.191: [scrub string table, 0.0000466 secs]: 328370K->690K(393216K), 0.0033748 secs] 369374K->4786K(491520K), [CMS Perm : 2526K->2526K(65536K)], 0.0068582 secs] [Times: user=0.06 sys=0.00, real=0.01 secs]
1.208: [GC 1.208: [ParNew: 65605K->0K(98304K), 0.0036942 secs] 148215K->82610K(491520K), 0.0037520 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
1.212: [GC [1 CMS-initial-mark: 82610K(393216K)] 86706K(491520K), 0.0000757 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
1.213: [CMS-concurrent-mark-start]
1.221: [GC 1.221: [ParNew: 61504K->0K(98304K), 0.0037417 secs] 144115K->82610K(491520K), 0.0037896 secs] [Times: user=0.03 sys=0.00, real=0.00 secs]
1.232: [CMS-concurrent-mark: 0.015/0.019 secs] [Times: user=0.03 sys=0.00, real=0.02 secs]
1.232: [CMS-concurrent-preclean-start]
1.233: [CMS-concurrent-preclean: 0.001/0.001 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
1.233: [CMS-concurrent-abortable-preclean-start]
1.235: [GC 1.235: [ParNew: 61504K->0K(98304K), 0.0024883 secs] 144115K->82610K(491520K), 0.0025358 secs] [Times: user=0.06 sys=0.00, real=0.00 secs]
1.246: [GC 1.246: [ParNew: 61504K->0K(98304K), 0.0019179 secs] 144115K->82610K(491520K), 0.0019619 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
1.257: [GC 1.257: [ParNew: 61504K->0K(98304K), 0.0019337 secs] 144115K->82610K(491520K), 0.0019807 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
1.267: [GC 1.267: [ParNew: 61504K->0K(98304K), 0.0029792 secs] 144115K->82610K(491520K), 0.0030211 secs] [Times: user=0.05 sys=0.00, real=0.00 secs]
1.286: [GC 1.286: [ParNew: 61509K->0K(98304K), 0.0017768 secs] 226039K->164530K(491520K), 0.0018204 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
1.297: [GC 1.297: [ParNew: 61504K->0K(98304K), 0.0041082 secs] 226035K->164530K(491520K), 0.0041561 secs] [Times: user=0.03 sys=0.00, real=0.00 secs]
1.311: [GC 1.311: [ParNew: 61504K->0K(98304K), 0.0034766 secs] 226035K->164530K(491520K), 0.0035283 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
1.322: [GC 1.322: [ParNew: 61504K->0K(98304K), 0.0026329 secs] 226035K->164530K(491520K), 0.0027009 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
1.334: [GC 1.334: [ParNew: 61504K->0K(98304K), 0.0023160 secs] 226035K->164530K(491520K), 0.0023660 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
1.344: [GC 1.344: [ParNew: 61504K->0K(98304K), 0.0019123 secs] 226035K->164530K(491520K), 0.0019568 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
1.354: [GC 1.354: [ParNew: 61504K->0K(98304K), 0.0016707 secs] 226035K->164530K(491520K), 0.0017122 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
1.358: [Full GC (System) 1.358: [CMS1.358: [CMS-concurrent-abortable-preclean: 0.016/0.125 secs] [Times: user=0.25 sys=0.00, real=0.13 secs]
(concurrent mode interrupted): 164530K->686K(393216K), 0.0098896 secs] 180933K->686K(491520K), [CMS Perm : 2526K->2523K(65536K)], 0.0099431 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]
Heap
par new generation total 98304K, used 1310K [0x04a60000, 0x0ca60000, 0x0ca60000)
eden space 65536K, 2% used [0x04a60000, 0x04ba7b48, 0x08a60000)
from space 32768K, 0% used [0x0aa60000, 0x0aa60000, 0x0ca60000)
to space 32768K, 0% used [0x08a60000, 0x08a60000, 0x0aa60000)
concurrent mark-sweep generation total 393216K, used 686K [0x0ca60000, 0x24a60000, 0x24a60000)
concurrent-mark-sweep perm gen total 65536K, used 2528K [0x24a60000, 0x28a60000, 0x28a60000)
------------------------------------------------------------------------
如何讀GC的日誌呢,其實有規律的,一般可以按下面理解
ParNew:全稱 Parallel New 指年輕代的並行回收結果。範式: “年輕代GC前->年輕代GC後(年輕代總空間),花費時間m.n秒。”
CMS:全稱 Concurent Mark Sweep 指年老代,持久代的並發回收處理。
           主要有幾個生命週期,如CMS-initial-mark,CMS-concurrent-mark-start,CMS-concurrent-mark,CMS-concurrent-preclean-start,
           CMS-concurrent-preclean,CMS-concurrent-abortable-preclean-start,CMS-concurrent-abortable-preclean,CMS-remark
           這幾個沒有使用略稱還是比較容易理解它們的動作的。其中第一個和最後一個會stopWorld,需要主要它們的花費時間。
GC/FullGC:涵蓋年輕代/年老代/持久代回收結果,以及耗費的時間。

Heap:堆的詳細資料
           par new generation 新生代資訊
           eden space Eden地區
           from space Survivor的第1個地區
           to space Survivor的第2個地區
           concurrent mark-sweep 年老代資訊
           concurrent-mark-sweep 持久代資訊
   最後對Survivor的from和to的兩個地區補充一下說明:
           當Eden第一次滿了之後,會把Eden活著的對象copy到from地區,然後清空Eden地區。
           當Eden第二次滿了之後,會把Eden活著的對象+from地區的對象,一起copy到to地區,然後清空Eden地區。
                        copy的過程中會保證對象的使用記憶體是連續的。
           當Eden第N次滿了時,會來對from或者to的Survivor地區再一次的進行乾坤大挪移。
                        部分對象命比較長,copy到一定次數還沒死,就會被挪移到老生代的Tenuring區中。

參看Link

http://unixboy.iteye.com/blog/174173/
http://www.jianshu.com/p/2fdee831ed03

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.