垃圾收集器
Serial收集器(新生代):?jiǎn)尉€程黄娘,工作時(shí)必須暫停其他線程(stop the world)伶贰,單線程效率最高迅脐,適用于client模式下的虛擬機(jī)愁溜。
ParNew即Parallel New收集器(新生代):Serial收集器的多線程版本疾嗅,唯一能與CMS收集器結(jié)合使用的收集器,默認(rèn)GC線程數(shù)與CPU數(shù)量相同冕象,可通過(guò)-XX:ParallelGCThreads參數(shù)來(lái)限制垃圾回收的線程數(shù)代承。
Parallel Scavenge收集器(新生代):注重可控制的吞吐量。(運(yùn)行用戶代碼時(shí)間/(運(yùn)行用戶代碼時(shí)間+垃圾收集時(shí)間))渐扮,適合少交互的后臺(tái)運(yùn)算论悴。-XX:MaxGCPauseMillis設(shè)置最大垃圾收集停頓時(shí)間(代價(jià):犧牲吞吐量與新生代空間掖棉,新生代調(diào)小會(huì)導(dǎo)致GC頻繁)、XX:GCTimeRatio設(shè)置吞吐量大小膀估、-XX:+UseAdaptiveSizePolicy(系統(tǒng)根據(jù)性能監(jiān)控信息幔亥,動(dòng)態(tài)調(diào)整參數(shù))。自適應(yīng)調(diào)節(jié)策略是Parallel Scavenge和ParNew的重要區(qū)別玖像。
Serial Old收集器(老年代):Serail收集器的老年代版本紫谷。使用標(biāo)記-整理算法。用途:在JDK1.5之前與Parallel Scavenge搭配使用捐寥、作為CMS收集器后備預(yù)案(發(fā)生Concurent Mode Failure)笤昨。
Parallel Old收集器(老年代):Parallel Scavenge收集器的老年代版本,使用“標(biāo)記-整理”算法握恳,用于注重吞吐量以及CPU資源敏感的場(chǎng)合
CMS收集器(老年代):分為初始標(biāo)記(STW)瞒窒、并發(fā)標(biāo)記、重新標(biāo)記(STW)乡洼、并發(fā)清除崇裁。
詳情參考,巨巨說(shuō)的很明白了束昵。CMS收集器詳解
G1收集器:G1收集器拔稳,還沒(méi)看懂,還要反回去看锹雏。
內(nèi)存分配與回收策略
1.對(duì)象優(yōu)先在eden分配
當(dāng)eden空間不足以分配的時(shí)候巴比,則發(fā)生mirror gc。當(dāng)Mirror gc發(fā)現(xiàn)已有的對(duì)象無(wú)法放入survivor區(qū)時(shí)礁遵,通過(guò)擔(dān)保機(jī)制將已有對(duì)象轉(zhuǎn)移到老年區(qū)轻绞。(SerialGC、ParNewGC)
-XX:+PrintGCDetails -XX:+UseSerialGC -Xms20m -Xmx20m -Xmn10m -XX:SurvivorRatio=8
2.大對(duì)象直接在老年代分配
-XX:+PretenureSizeThreshold佣耐,當(dāng)大于這個(gè)設(shè)置值的對(duì)象政勃,直接在老年代分配(SerialGC、ParNewGC)兼砖。
-XX:+PrintGCDetails -XX:+UseSerialGC -Xms20m -Xmx20m -Xmn10m -XX:SurvivorRatio=8 -XX:PretenureSizeThreshold=3145728
3.長(zhǎng)期存活的對(duì)象將進(jìn)入老年代
若對(duì)象在eden出生奸远,經(jīng)過(guò)第一次GC能進(jìn)入survivor區(qū),仍然存活掖鱼,則歲數(shù)為1然走。每一次存活,則歲數(shù)+1戏挡。MaxTenuringThreshold該參數(shù)指定了歲數(shù)到多少的新生代對(duì)象將進(jìn)入老年代。
-verbose:gc -XX:+UseSerialGC -Xms20m -Xmx20m -Xmn10m -XX:+PrintGCDetails -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=1 -XX:+PrintTenuringDistribution
public static void testTenuringThreshold(){
byte[] a1,a2,a3;
a1= new byte[oneMB/4];
a2=new byte[oneMB*4];
a3=new byte[oneMB*4];
a3=null;
a3=new byte[oneMB*4];
}
[GC (Allocation Failure) [DefNew
Desired survivor size 524288 bytes, new threshold 1 (max 1)
- age 1: 981656 bytes, 981656 total
: 6505K->958K(9216K), 0.0038322 secs] 6505K->5054K(19456K), 0.0038761 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
//第一次GC晨仑,Allocation Failure表明是因?yàn)闊o(wú)法分配eden內(nèi)存產(chǎn)生的GC褐墅,即無(wú)法給a3在eden空間分配內(nèi)存拆檬,此時(shí),由于a1<survivor1妥凳,則a1進(jìn)入survivor竟贯,a2由于擔(dān)保機(jī)制進(jìn)入老年代
[GC (Allocation Failure) [DefNew
Desired survivor size 524288 bytes, new threshold 1 (max 1)
- age 1: 2136 bytes, 2136 total
: 5138K->2K(9216K), 0.0020616 secs] 9234K->5052K(19456K), 0.0020883 secs] [Times: user=0.02 sys=0.00, real=0.00 secs]
Heap
def new generation total 9216K, used 4317K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000)
eden space 8192K, 52% used [0x00000000fec00000, 0x00000000ff036bb0, 0x00000000ff400000)
from space 1024K, 0% used [0x00000000ff400000, 0x00000000ff400858, 0x00000000ff500000)
to space 1024K, 0% used [0x00000000ff500000, 0x00000000ff500000, 0x00000000ff600000)
tenured generation total 10240K, used 5050K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)
the space 10240K, 49% used [0x00000000ff600000, 0x00000000ffaeeab8, 0x00000000ffaeec00, 0x0000000100000000)
Metaspace used 3366K, capacity 4496K, committed 4864K, reserved 1056768K
class space used 369K, capacity 388K, committed 512K, reserved 1048576K
//第二次GC,a1由于年齡到了1歲逝钥,則進(jìn)入老年代屑那,則survivor used 0%(From Survivor區(qū)域與To Survivor區(qū)域是交替切換空間,在同一時(shí)間內(nèi)兩者中只有一個(gè)不為空)艘款,a3old被gc持际,a3new則在eden區(qū)生成
4.動(dòng)態(tài)對(duì)象年齡判定
若survivor區(qū)中,size[o1]+size[o2]+……+size[on]>=survivor/2哗咆,且age[o1]==age[o2]==……==age[on]蜘欲,則o1,o2,o3……on一起進(jìn)入老年區(qū)。此時(shí)并不需要o1.age>=MaxTenuringThreshold
-verbose:gc -XX:+UseSerialGC -Xms20m -Xmx20m -Xmn10m -XX:+PrintGCDetails -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=15 -XX:+PrintTenuringDistribution
public static void testTenuringThreshold2() {
byte[] a1, a2, a3, a4;
a1 = new byte[oneMB / 4];
a2 = new byte[oneMB / 4];
a3 = new byte[oneMB * 4];
a4 = new byte[oneMB * 4];
a4 = null;
a4 = new byte[oneMB * 4];
}
5.空間分配擔(dān)保
用于minorGC前的檢查策略晌柬。-XX:HandlePromotionFailure=true
在JDK6 update24后姥份,廢棄HandlePromotionFailur,即老年代連續(xù)最大空間>新生代所有對(duì)象總大小年碘,或大于歷次晉升對(duì)象平均大小澈歉,則進(jìn)行minorGC,否則進(jìn)行fullGC