一、理解JVM日志
從深入理解JVM書(shū)上的例子開(kāi)始官边,各個(gè)收集器的日志格式不同磕昼,但是都維持一定的共性:
33.125:[GC[DefNew:3324K->152K(3712K),0.0025925secs]3324K->152K(11904K)巡雨,0.0031680 secs]
100.667:[FullGC[Tenured:0K->210K(10240K)棍辕,0.0149142secs]4603K->210K(19456K)暮现,[Perm:2999K->2999K(21248K)],0.0150007 secs][Times:user=0.01 sys=0.00楚昭,real=0.02 secs]
①:第一個(gè)數(shù)值(33.125栖袋、100.667)代表GC發(fā)生的時(shí)間,從虛擬機(jī)啟動(dòng)起來(lái)后經(jīng)歷的秒數(shù)
②:第二個(gè)GC抚太、FullGC代表這次垃圾收集的停頓類(lèi)型塘幅。如果FullGC代表是stop-the-world【不是用于區(qū)分GC發(fā)生在新生代或老年代】
③DefNew(新生代)、Tenured(老年代)尿贫,Perm(永久代)表示GC發(fā)生的區(qū)域电媳,區(qū)域名根據(jù)垃圾收集器的不同而不同,如Serial收集器新生代命名為DefNew(Default New Generation)庆亡。ParNew收集器新生代命名ParNew(Parallel New Generation)匾乓。Parallel Scavenge收集器 新生代命名PSYoungGen。 老年代和永久代同理又谋,名稱(chēng)也由收集器決定
④第四個(gè)3324K->152K(3712K)代表GC前用量->GC后用量(該內(nèi)存區(qū)域重量)
⑤方括號(hào)外3324K->152K(11904K)拼缝,0.0031680 secs]表示GC前JAVA堆已使用容量->GC后JAVA堆使用量(java堆總量)
⑥0.0031680 secs代表GC占用的時(shí)間
二、新生代復(fù)制算法
目前大部分垃圾收集器對(duì)于新生代都采取Copying算法彰亥,因?yàn)樾律忻看卫厥斩家厥沾蟛糠謱?duì)象咧七,也就是說(shuō)需要復(fù)制的操作次數(shù)較少,但是實(shí)際中并不是按照1:1的比例來(lái)劃分新生代的空間的剩愧,一般來(lái)說(shuō)是將新生代劃分為一塊較大的Eden空間和兩塊較小的Survivor空間猪叙,每次使用Eden空間和其中的一塊Survivor空間娇斩,當(dāng)進(jìn)行回收時(shí)仁卷,將Eden和Survivor中還存活的對(duì)象復(fù)制到另一塊Survivor空間中穴翩,然后清理掉Eden和剛才使用過(guò)的Survivor空間。
三:其他回收規(guī)則
①長(zhǎng)期存活對(duì)象進(jìn)入老年代規(guī)則:如果對(duì)象在Eden區(qū)出生并經(jīng)過(guò)第一次MinorGC后仍然存活锦积,并且被Survivor容納的話芒帕,就會(huì)被移動(dòng)到Survivor空間,并將對(duì)象年齡設(shè)為1丰介,對(duì)象每在Survivor熬過(guò)一次Minor GC背蟆,年齡就增加一歲,到達(dá)一定年齡就被移動(dòng)到老年代
②動(dòng)態(tài)年齡判定:如果Survivor區(qū)相同年齡對(duì)象大小大于Survivor區(qū)一半哮幢,就可直接移動(dòng)到老年代带膀,無(wú)需到達(dá)指定年齡
③空間分配擔(dān)保:在MinorGC前,虛擬機(jī)會(huì)檢查老年代最大連續(xù)可用空間是否大于新生代所有對(duì)象空間橙垢,如果成立則MinorGC確保安全垛叨。如果不成立則虛擬機(jī)會(huì)檢查是否允許擔(dān)保失敗。如果允許柜某,那么會(huì)檢查老年代最大可用連續(xù)空間是否大于歷次晉升到老年代對(duì)象的平均大小嗽元,如果大于則嘗試進(jìn)行MinorGC,如果小于或者不允許擔(dān)保失敗則進(jìn)行FullGC