基本介紹
- 中文名:ParNew收集器
- 版本:在JDK1.6以及之前的版本中
- 運行模式:在Server模式
- 運行環境:虛擬機
定義,虛擬機空間,運行結果,對比,
定義
ParNew收集器是JAVA虛擬機中垃圾收集器的一種。它是Serial收集器的多執行緒版本,除了使用多條執行緒進行垃圾收集狼棕榆之外,其餘行為包括Serial收集器可用的所有控制參數(例如:-XX:SurvivorRatio、 -XX:PretenureSizeThreshold、-XX:HandlePromotionFailure等)、收集算法、Stop The World、對象分配規則、回收策略頸體等都與Serial收集器一致。
ParNew是許多運行在Server模式下的虛擬機中首選的新生代收集器,,除了Serial收集器外永廈廈,只有它能與CMS收集器配合工作。
虛擬機空間
固定JAVA虛擬機空間
原始碼:
package com.gc;
import java.util.ArrayList;
import java.util.List;
/**
*簡單的JAVA虛擬機記憶體回收戒連晚,parNew收集器的使用
*運行參數,見具辯糠悼踏體方法
* @author范芳銘
*/
public class EasyParNew {
public byte[] placeHolder =new byte[64 * 1024]; //占位符
public static void main(String[]args) throws Exception{
outOfMemoryByFixSize();
}
/**
*固定JAVA虛擬機的大小
*參數:-Xms30m -Xmx30m-Xmn10m -XX:+UseParNewGC -XX:+PrintGCDetails
* @author范芳銘
*/
private static voidoutOfMemoryByFixSize() throws Exception{
List<EasyParNew>list = new ArrayList<EasyParNew>();
while(true){
EasyParNewserial = new EasyParNew();
list.add(serial);
Thread.sleep(10);//停頓10毫秒
}
}
/**
* JAVA虛擬機的大小適當可擴展,其中燥射炒Xms30m,辯紙促跨Xmx40m
*參數:-Xms30m -Xmx40m-XX:+UseParNewGC -XX:+PrintGCDetails
* @author范芳銘
*/
private static voidoutOfMemoryByExpansionSize() throws Exception{
List<EasyParNew>list = new ArrayList<EasyParNew>();
while(true){
EasyParNewserial = new EasyParNew();
list.add(serial);
Thread.sleep(10);//停頓10毫秒
}
}
}
參數:
-Xms30m -Xmx30m -Xmn10m -XX:+UseParNewGC -XX:+PrintGCDetails
其中,-XX:+UseParNewGC表示要強制使用parNew收集器在新生代回收空間。
運行結果
[GC [ParNew: 8137K->980K(9216K),0.0057214 secs] 8137K->8022K(29696K), 0.0057563 secs] [Times: user=0.01sys=0.00, real=0.01 secs]
[GC [ParNew: 9131K->1021K(9216K),0.0058799 secs] 16173K->16215K(29696K), 0.0059148 secs] [Times: user=0.00sys=0.00, real=0.01 secs]
[GC [ParNew: 9207K->9207K(9216K),0.0000123 secs][Tenured: 15194K->20447K(20480K), 0.0071258 secs]24401K->24289K(29696K), [Perm : 2086K->2086K(12288K)], 0.0071911 secs][Times: user=0.00 sys=0.00, real=0.01 secs]
[Full GC [Tenured:20447K->20447K(20480K), 0.0038141 secs] 29576K->29543K(29696K), [Perm :2086K->2086K(12288K)], 0.0038490 secs] [Times: user=0.00 sys=0.00, real=0.00secs]
[Full GC [Tenured:20447K->20436K(20480K), 0.0063466 secs] 29543K->29532K(29696K), [Perm :2086K->2084K(12288K)], 0.0063865 secs] [Times: user=0.00 sys=0.00, real=0.01secs]
Exception in thread "main"java.lang.OutOfMemoryError: Java heap space
atcom.gc.EasyParNew.<init>(EasyParNew.java:12)
atcom.gc.EasyParNew.outOfMemoryByFixSize(EasyParNew.java:25)
atcom.gc.EasyParNew.main(EasyParNew.java:14)
Heap
par new generation total 9216K, used 9152K [0x03c10000,0x04610000, 0x04610000)
eden space 8192K, 100% used [0x03c10000, 0x04410000, 0x04410000)
from space 1024K, 93% used[0x04410000, 0x045000f0, 0x04510000)
to space 1024K, 0% used [0x04510000, 0x04510000, 0x04610000)
tenured generation total 20480K, used 20436K [0x04610000,0x05a10000, 0x05a10000)
the space 20480K, 99% used [0x04610000, 0x05a052b8, 0x05a05400,0x05a10000)
對比
ParNew收集器和Serial收集器的差異
ParNew收集器在單CPU的環境中絕對不會有比Serial收集器更好的效果,甚至由於存線上程互動的開銷,該收集器在通過超執行緒技術實現的兩個CPU的環境中都不能百分之百地保證能超越Serial收集器。當然,隨著可以使用的CPU的數量的增加,它對於GC時系統資源的利用還是很有好處的。它默認開啟的收集執行緒數與CPU的數量相同,在CPU非常多,可以使用-XX:ParallelGCThreads參數來限制垃圾收集的執行緒數。
並行(Parallel):指多條垃圾收集執行緒並行工作,但此時用戶執行緒仍然處於等待狀態。
並發(Concurrent):指用戶執行緒與垃圾收集執行緒同時執行(但不一定是並行的,可能會交替執行),用戶程式繼續運行,而垃圾收集程式運行於另一個CPU上。
[GC [DefNew:1986K->128K(2112K), 0.0011191 secs] 27809K->27808K(30528K), 0.0011425secs] [Times: user=0.00 sys=0.01, real=0.00 secs]
和
[GC [ParNew:1990K->132K(2112K), 0.0007742 secs] 24112K->24110K(30528K), 0.0007964secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
其中的GC [ParNew表示使用的是parNew收集器。
GC [DefNew表示用的是serial收集器。
List<EasyParNew>list = new ArrayList<EasyParNew>();
while(true){
EasyParNewserial = new EasyParNew();
list.add(serial);
Thread.sleep(10);//停頓10毫秒
}
}
}
參數:
-Xms30m -Xmx30m -Xmn10m -XX:+UseParNewGC -XX:+PrintGCDetails
其中,-XX:+UseParNewGC表示要強制使用parNew收集器在新生代回收空間。
運行結果
[GC [ParNew: 8137K->980K(9216K),0.0057214 secs] 8137K->8022K(29696K), 0.0057563 secs] [Times: user=0.01sys=0.00, real=0.01 secs]
[GC [ParNew: 9131K->1021K(9216K),0.0058799 secs] 16173K->16215K(29696K), 0.0059148 secs] [Times: user=0.00sys=0.00, real=0.01 secs]
[GC [ParNew: 9207K->9207K(9216K),0.0000123 secs][Tenured: 15194K->20447K(20480K), 0.0071258 secs]24401K->24289K(29696K), [Perm : 2086K->2086K(12288K)], 0.0071911 secs][Times: user=0.00 sys=0.00, real=0.01 secs]
[Full GC [Tenured:20447K->20447K(20480K), 0.0038141 secs] 29576K->29543K(29696K), [Perm :2086K->2086K(12288K)], 0.0038490 secs] [Times: user=0.00 sys=0.00, real=0.00secs]
[Full GC [Tenured:20447K->20436K(20480K), 0.0063466 secs] 29543K->29532K(29696K), [Perm :2086K->2084K(12288K)], 0.0063865 secs] [Times: user=0.00 sys=0.00, real=0.01secs]
Exception in thread "main"java.lang.OutOfMemoryError: Java heap space
atcom.gc.EasyParNew.<init>(EasyParNew.java:12)
atcom.gc.EasyParNew.outOfMemoryByFixSize(EasyParNew.java:25)
atcom.gc.EasyParNew.main(EasyParNew.java:14)
Heap
par new generation total 9216K, used 9152K [0x03c10000,0x04610000, 0x04610000)
eden space 8192K, 100% used [0x03c10000, 0x04410000, 0x04410000)
from space 1024K, 93% used[0x04410000, 0x045000f0, 0x04510000)
to space 1024K, 0% used [0x04510000, 0x04510000, 0x04610000)
tenured generation total 20480K, used 20436K [0x04610000,0x05a10000, 0x05a10000)
the space 20480K, 99% used [0x04610000, 0x05a052b8, 0x05a05400,0x05a10000)
對比
ParNew收集器和Serial收集器的差異
ParNew收集器在單CPU的環境中絕對不會有比Serial收集器更好的效果,甚至由於存線上程互動的開銷,該收集器在通過超執行緒技術實現的兩個CPU的環境中都不能百分之百地保證能超越Serial收集器。當然,隨著可以使用的CPU的數量的增加,它對於GC時系統資源的利用還是很有好處的。它默認開啟的收集執行緒數與CPU的數量相同,在CPU非常多,可以使用-XX:ParallelGCThreads參數來限制垃圾收集的執行緒數。
並行(Parallel):指多條垃圾收集執行緒並行工作,但此時用戶執行緒仍然處於等待狀態。
並發(Concurrent):指用戶執行緒與垃圾收集執行緒同時執行(但不一定是並行的,可能會交替執行),用戶程式繼續運行,而垃圾收集程式運行於另一個CPU上。
[GC [DefNew:1986K->128K(2112K), 0.0011191 secs] 27809K->27808K(30528K), 0.0011425secs] [Times: user=0.00 sys=0.01, real=0.00 secs]
和
[GC [ParNew:1990K->132K(2112K), 0.0007742 secs] 24112K->24110K(30528K), 0.0007964secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
其中的GC [ParNew表示使用的是parNew收集器。
GC [DefNew表示用的是serial收集器。