1. 程式人生 > >幾中垃圾收集器組合測試

幾中垃圾收集器組合測試

測試程式碼:

public class demonopara {

private static final int _1MB = 1024*1024;

public static void main(String[] args) {

// TODO Auto-generated method stub

byte[] allocation1,allocation2,allocation3,allocation4;

allocation1 = new byte[2 * _1MB];

allocation2 = new byte[2 * _1MB];

allocation3 = new byte[2 * _1MB];

allocation4 = new byte[4 * _1MB];

}

}

JVM引數:-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8

(堆大小20M,不可拓展,10M新生代,10M老生代,Eden和Survivor的比例是8:1,OK)

1.Parallel Scavenge + Serial Old(-XX:+UseParallelGC)

Heap

 PSYoungGen      total 9216K, used 7159K [0x00000007ff600000, 0x0000000800000000, 0x0000000800000000)

  eden space 8192K, 87% used [0x00000007ff600000,0x00000007ffcfde20,0x00000007ffe00000)

  from space 1024K, 0% used [0x00000007fff00000,0x00000007fff00000,0x0000000800000000)

  to   space 1024K, 0% used [0x00000007ffe00000,0x00000007ffe00000,0x00000007fff00000)

 ParOldGen       total 10240K, used 4096K [0x00000007fec00000, 0x00000007ff600000, 0x00000007ff600000)

  object space 10240K, 40% used [0x00000007fec00000,0x00000007ff000010,0x00000007ff600000)

 PSPermGen       total 21504K, used 2611K [0x00000007f9a00000, 0x00000007faf00000, 0x00000007fec00000)

  object space 21504K, 12% used [0x00000007f9a00000,0x00000007f9c8cc78,0x00000007faf00000)

//前三個物件allocation1,allocation2,allocation3都分配到了,Eden區,第四個4M的直接去了老生代。。。 //-XX:+PretenureSizeThreshold  直接晉升老生代的物件的大小,設定這個引數後,大於這個引數的物件直接在老生代分配。但是!!!請注意!!!PretenureSizeThreshold這個引數只對Serial和parNew有用,Parallel Scavenge不認識他。。

2.Serial+Serial Old(-XX:+UseSerialGC)

[GC[DefNew: 6995K->240K(9216K), 0.0044170 secs] 6995K->6384K(19456K), 0.0044380 secs] [Times: user=0.01 sys=0.01, real=0.01 secs] 

Heap

 def new generation   total 9216K, used 4666K [0x00000007f9a00000, 0x00000007fa400000, 0x00000007fa400000)

  eden space 8192K,  54% used [0x00000007f9a00000, 0x00000007f9e527b0, 0x00000007fa200000)

  from space 1024K,  23% used [0x00000007fa300000, 0x00000007fa33c198, 0x00000007fa400000)

  to   space 1024K,   0% used [0x00000007fa200000, 0x00000007fa200000, 0x00000007fa300000)

 tenured generation   total 10240K, used 6144K [0x00000007fa400000, 0x00000007fae00000, 0x00000007fae00000)

   the space 10240K,  60% used [0x00000007fa400000, 0x00000007faa00030, 0x00000007faa00200, 0x00000007fae00000)

 compacting perm gen  total 21248K, used 2614K [0x00000007fae00000, 0x00000007fc2c0000, 0x0000000800000000)

   the space 21248K,  12% used [0x00000007fae00000, 0x00000007fb08d840, 0x00000007fb08da00, 0x00000007fc2c0000)

No shared spaces configured.

這對組合就是中規中矩的,Eden發現4MB放不下了,觸發MinorGC,GC期間發現3個2MB全部無法放到Survivor裡面,所以只好通過擔保機制提前轉移到老年代中去。然後Eden放進了4MB的物件。

3.ParNew + Serial Old(-XX:+UseParNewGC)

[GC[ParNew: 6995K->282K(9216K), 0.0039460 secs] 6995K->6426K(19456K), 0.0039770 secs] [Times: user=0.01 sys=0.01, real=0.00 secs] 

Heap

 par new generation   total 9216K, used 4708K [0x00000007f9a00000, 0x00000007fa400000, 0x00000007fa400000)

  eden space 8192K,  54% used [0x00000007f9a00000, 0x00000007f9e527b0, 0x00000007fa200000)

  from space 1024K,  27% used [0x00000007fa300000, 0x00000007fa346a50, 0x00000007fa400000)

  to   space 1024K,   0% used [0x00000007fa200000, 0x00000007fa200000, 0x00000007fa300000)

 tenured generation   total 10240K, used 6144K [0x00000007fa400000, 0x00000007fae00000, 0x00000007fae00000)

   the space 10240K,  60% used [0x00000007fa400000, 0x00000007faa00030, 0x00000007faa00200, 0x00000007fae00000)

 compacting perm gen  total 21248K, used 2614K [0x00000007fae00000, 0x00000007fc2c0000, 0x0000000800000000)

   the space 21248K,  12% used [0x00000007fae00000, 0x00000007fb08d840, 0x00000007fb08da00, 0x00000007fc2c0000)

No shared spaces configured.

跟上面的差不多。。。

4.Parallel Scavenge + Parallel Old(-XX:+UseParallelOldGC)

Heap

 PSYoungGen      total 9216K, used 7159K [0x00000007ff600000, 0x0000000800000000, 0x0000000800000000)

  eden space 8192K, 87% used [0x00000007ff600000,0x00000007ffcfde20,0x00000007ffe00000)

  from space 1024K, 0% used [0x00000007fff00000,0x00000007fff00000,0x0000000800000000)

  to   space 1024K, 0% used [0x00000007ffe00000,0x00000007ffe00000,0x00000007fff00000)

 ParOldGen       total 10240K, used 4096K [0x00000007fec00000, 0x00000007ff600000, 0x00000007ff600000)

  object space 10240K, 40% used [0x00000007fec00000,0x00000007ff000010,0x00000007ff600000)

 PSPermGen       total 21504K, used 2611K [0x00000007f9a00000, 0x00000007faf00000, 0x00000007fec00000)

  object space 21504K, 12% used [0x00000007f9a00000,0x00000007f9c8cc78,0x00000007faf00000)

parallel Scavenge。。。新分配的4MB去了老生代

5.ParNew + CMS + Serial Old(-XX:+UseConcMarkSweepGC)

[GC[ParNew: 7003K->289K(9216K), 0.0046330 secs] 7003K->6435K(19456K), 0.0046730 secs] [Times: user=0.02 sys=0.01, real=0.00 secs] 

[GC [1 CMS-initial-mark: 6146K(10240K)] 10531K(19456K), 0.0002410 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 

Heap

 par new generation   total 9216K, used 4715K [0x00000007f9a00000, 0x00000007fa400000, 0x00000007fa400000)

  eden space 8192K,  54% used [0x00000007f9a00000, 0x00000007f9e527a8, 0x00000007fa200000)

  from space 1024K,  28% used [0x00000007fa300000, 0x00000007fa348520, 0x00000007fa400000)

  to   space 1024K,   0% used [0x00000007fa200000, 0x00000007fa200000, 0x00000007fa300000)

 concurrent mark-sweep generation total 10240K, used 6146K [0x00000007fa400000, 0x00000007fae00000, 0x00000007fae00000)

 concurrent-mark-sweep perm gen total 21248K, used 2615K [0x00000007fae00000, 0x00000007fc2c0000, 0x0000000800000000)

6MB去了老生代,4MB在新生代,而且,持久代也用了CMS~~~ 6.G1(-XX:+UseG1GC)

[GC pause (young) (initial-mark), 0.0014180 secs]

   [Parallel Time: 1.0 ms, GC Workers: 8]

      [GC Worker Start (ms): Min: 120.1, Avg: 120.2, Max: 120.6, Diff: 0.5]

      [Ext Root Scanning (ms): Min: 0.0, Avg: 0.2, Max: 0.4, Diff: 0.4, Sum: 1.9]

      [Code Root Marking (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]

      [Update RS (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]

         [Processed Buffers: Min: 0, Avg: 1.1, Max: 5, Diff: 5, Sum: 9]

      [Scan RS (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]

      [Code Root Scanning (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]

      [Object Copy (ms): Min: 0.4, Avg: 0.5, Max: 0.6, Diff: 0.2, Sum: 3.7]

      [Termination (ms): Min: 0.0, Avg: 0.1, Max: 0.1, Diff: 0.1, Sum: 0.6]

      [GC Worker Other (ms): Min: 0.0, Avg: 0.0, Max: 0.1, Diff: 0.1, Sum: 0.3]

      [GC Worker Total (ms): Min: 0.5, Avg: 0.8, Max: 1.0, Diff: 0.5, Sum: 6.6]

      [GC Worker End (ms): Min: 121.0, Avg: 121.1, Max: 121.1, Diff: 0.1]

   [Code Root Fixup: 0.0 ms]

   [Code Root Migration: 0.0 ms]

   [Clear CT: 0.1 ms]

   [Other: 0.3 ms]

      [Choose CSet: 0.0 ms]

      [Ref Proc: 0.2 ms]

      [Ref Enq: 0.0 ms]

      [Free CSet: 0.0 ms]

   [Eden: 1024.0K(10.0M)->0.0B(9216.0K) Survivors: 0.0B->1024.0K Heap: 6588.3K(20.0M)->6560.0K(20.0M)]

 [Times: user=0.01 sys=0.01, real=0.00 secs] 

[GC concurrent-root-region-scan-start] 第一階段開始,初始標記

[GC concurrent-root-region-scan-end, 0.0002720 secs]初始標記完畢

[GC concurrent-mark-start]    併發標記

[GC concurrent-mark-end, 0.0000430 secs]

[GC remark [GC ref-proc, 0.0000610 secs], 0.0005240 secs]  重新標記

 [Times: user=0.00 sys=0.00, real=0.01 secs] 

[GC cleanup 10M->10M(20M), 0.0004140 secs]   篩選回收,就是清理

 [Times: user=0.00 sys=0.00, real=0.00 secs] 

Heap

 garbage-first heap   total 20480K, used 10656K [0x00000007f9a00000, 0x00000007fae00000, 0x00000007fae00000)

  region size 1024K, 2 young (2048K), 1 survivors (1024K)

 compacting perm gen  total 20480K, used 2614K [0x00000007fae00000, 0x00000007fc200000, 0x0000000800000000)

   the space 20480K,  12% used [0x00000007fae00000, 0x00000007fb08d840, 0x00000007fb08da00, 0x00000007fc200000)

No shared spaces configured.

其實我也知道這樣測G1什麼也測不出什麼特性來,我就是好奇。。。玩玩~

首先,發現G1的時間很棒哎~其他的都是0.004.。。G1:0.001

region size 1024K

 Heap: 6588.3K(20.0M)->6560.0K(20.0M)。。。我很想知道我的4MB去哪了。。。
garbage-first heap   total 20480K, used 10656K 只能在這看到10M是全的。。。
這裡我會更新的。 另外,由於-XX:+UseParallelGC和-XX:+UseParallelOldGC看上去效果差不多,大R解釋: 只用UseParallelGC與用了UseParallelOldGC背後實際的collector不一樣,前者在HotSpot VM內是PSMarkSweep,後者是PSParallelCompact。 
http://hllvm.group.iteye.com/group/topic/37945

相關推薦

垃圾收集組合測試

測試程式碼: public class demonopara { private static final int _1MB = 1024*1024; public static void main(String[] args) { // TODO Auto-ge

JVM之垃圾收集簡單介紹

new root 哪些 組合 sca jpg 跨年 tails ive 本文中的垃圾收集器研究背景為:HotSpot+JDK1.7 一、垃圾收集器概述 如上圖所示,垃圾回收算法一共有7個,3個屬於年輕代、三個屬於年老代,G1屬於橫跨年輕代和年老代的算法。 JVM會

HotSpot的7種垃圾收集組合

HotSpot共有7種垃圾收集器,3個新生代垃圾收集器,3個老年代垃圾收集器,以及G1,一共構成7種可供選擇的垃圾收集器組合。 新生代與老年代垃圾收集器之間形成6種組合,每個新生代垃圾收集器都對應2種組合。 Serial Old(MSC)可以與所有新生代收集器進行組合,共3種組合 JVM僅指定新生代垃圾

JVM垃圾收集組合--各種組合對應的虛擬機器引數實踐

前言 相信很多人都看過下面這張圖,(來自《深入理解Java虛擬機器:JVM高階特性與最佳實踐》)     在學完幾種垃圾收集器型別及組合後,打算看看實際中程式用到的垃圾收集器。 但是在jconsole中看到的,如下:    兩邊的名稱並不完全匹配,

jdk1.6垃圾收集

圖1展示了1.6中提供的6種作用於不同年代的收集器,兩個收集器之間存在連線的話就說明它們可以搭配使用。在介紹著些收集器之前,我們先明確一個觀點:沒有最好的收集器,也沒有萬能的收集器,只有最合適的收集器。 1.Serial收集器 單執行緒收集器,收集時會暫停所有工作執行緒(

聊聊JAVA虛擬機垃圾收集

垃圾收集器 JAVA虛擬機 內存區域模型 Parallel GC CMS GC 前言 JAVA虛擬機的垃圾收集器是虛擬機內存的清道夫,它的存在讓JAVA開發人員能將更多精力投入到業務研發上。了解垃圾收集器,並利用好這個工具,能更好的保障服務穩定性。這篇文章通過分析JAVA虛擬機內存模型,介

jvm垃圾收集

1、Serial收集器 Seral收集器是最基本、歷史最悠久的收集器,曾經(在JDK1.3.1之前)是虛擬機器新生代收集的唯一選擇。它是單執行緒收集器,它在進行垃圾收集時,必須停止所有的工作執行緒,直到它收集結束。“Stop The World”把使用者正常工作的執行緒全部停掉,多少會令使用者無

JVM垃圾回收演算法和種JVM垃圾收集

一、JVM垃圾回收演算法 注意:只是簡單總結,不詳細解釋演算法概念,不理解自行百度。 1、複製演算法 2、標記-清理演算法 3、標記-整理演算法 4、兩個概念: 新生代:初始物件,一般是採用複製演算法,需要重點掌握理解,記憶體被分為一個Eden,兩個Survivor區。

javajvm垃圾收集簡單介紹

jvm垃圾收集器(新生代) serial收集器 serial收集器是最基本、發展歷史最悠久的收集器,jdk1.3.1之前是新生代收集的唯一選擇。採用複製演算法。這個收集器是單執行緒收集器,它在進行垃圾收集時,必須暫停其他所有的工作執行緒,直到它收集結束(stop the world)。它依然

JVM各個垃圾收集的使用場景

在以往的文章中(垃圾收集演算法),我們講述了JVM中垃圾收集演算法,像標記-清除、標記-整理、複製、分代等演算法,這些只是垃圾收集的方法論,今天要介紹的就是垃圾收集的具體實現---垃圾收集器。 垃圾收集器主要用於堆記憶體中,先從一張圖中看下堆中老年代和新生代所適合的垃圾收集器,JDK11出來的Z

java垃圾收集方法和垃圾收集

  標記清除法:   分為兩個階段,標記----清除    C標記階段將所有需要回收的物件做標記,然後在清除階段將所有的標記物件回收   但是這種回收方法有很大的缺點,那就是這兩個過程的的效率並不高,兩個過程都是效率很低的過程   另外一個缺點就是標記清除之後,因為之前並沒有移動

JVM的GC演算法,JVM引數,垃圾收集分類

一.在JVM中什麼是垃圾?如何判斷一個物件是否可被回收?哪些物件可以作為GC Roots的根   垃圾就是在記憶體中已經不再被使用到的空間就是垃圾.   1.引用計數法:     內部使用一個計數器,當有物件被引用+1,沒有就-1,但是沒有辦法解決迴圈引用的問題,JVM不採用此類回收法   2.列舉根節點可達

JVM-垃圾收集

執行 number nbsp 技術 操作 表示 響應 ati 整合 本篇主要介紹一下JVM的幾種垃圾收集器。其示意圖例如以下所看到的,上面的三個是新生代的收集器, 以下三個是老年代的收集器。當中G1收集器是能夠用於新生代和老年代的收集工作。 JVM垃圾收集器 1、S

【5】JVM-垃圾收集

garbage 垃圾收集器 發展 access 表示 新生代 動態 導致 ren 通過學習了解到現在商用的JVM中的垃圾收集采用的是分代收集算法,即針對不同年代采用不同的收集算法。在JVM中,GC主要作用於堆內存中,堆內存又被劃分為新生代和老年代,由於新生代對象絕大多數是朝

深入理解JVM:垃圾收集與內存分配策略

四種 內存回收 第一次 不可達 append test 方法 static hot 堆裏面存放著Java世界差點兒全部的對象實例,垃圾收集器在對堆進行回收前。第一件事情就是要確定這些對象之中哪些還存活,哪些已經死去。推斷對象的生命周期是否結束有下面幾種方

Head first java chapter 9構造垃圾收集

運算 不同 垃圾 使用 log 特殊 返回 oid div 構造函數是一種特殊的函數。其主要功能是用來在創建對象時初始化對象, 即為v對象成員變量賦初始值,總與new運算符一起使用在創建對象的語句中。構造函數與類名相同,可重載多個不同的構造函數。在JAVA

CMS垃圾收集

mos use mvd gmv 資源 meta rtl 結構 mdk 一、CMS垃圾收集器介紹 眾所周知,在oracle公司的Hotspot的架構中,大體上采用分代回收的機制。其中出生代又采用了拷貝復制的方法。如果對象在初生代內存活超過一定次數之後,就可以晉升到老生代中,而

JVM(五)-垃圾收集算法和垃圾收集

images 暫停 cell lol tsp 普通 最適 連線 begin 一、垃圾收集算法 (1)標記—清除算法 “標記-清除”(Mark-Sweep)算法,如它的名字一樣,算法分為“標記”和“清除”兩個階段:首先標記出所有需要回收的對象,在標記完成後統一回收掉所有被標記

JVM垃圾收集選項

命令 命令行選項 sep 新的 操作 lol 操作模式 激活 缺省 最初並發垃圾收集被引入的時候,激活並發垃圾收集的命令選項是: -XX:+UseParallelGC 增強的並行收集和Java 6一起發布,通過一個新的命令行選項: -XX:+UseParallelOldGC

垃圾收集與內存分配策略

使用 對象比較 內存空間 強引用 公司 enc 虛引用 我們 內存溢出 1. 垃圾收集器與內存分配策略 垃圾回收機制(Garbage Collection,GC),GC的歷史要比java悠久。1960年誕生於MIT的Lisp是第一個真正使用內存動態分配和垃圾收集技術