-
JVM 內(nèi)存結(jié)構(gòu)
Hotspot Achitecture.png
需要用來調(diào)優(yōu)的主要就是堆和垃圾回收器,基于兩個方面調(diào)優(yōu),一個是Responsiveness, 一個是Throughput(例如一次做多執(zhí)行多少次transaction)
-
自動垃圾回收
第一步標(biāo)記已經(jīng)使用過的內(nèi)存
Marking.png
第二步刪除unreferenced objects

第三步壓縮

上述方法效率不高,原因就是隨著越來越多的Object 被分配,導(dǎo)致越來越長時間的垃圾回收,實際情況是很多被分配的Object存在的時間很短。如下圖

3.JVM Generations
堆被分布三個部分: Young Generation, Old or Tenured Generation, and Permanent Generation

Young Generation是新分配的objects被分配的地方。當(dāng)它滿了會產(chǎn)生一個
minor garbage collection。根據(jù)object存在時間少的特性,回收效率很高。同時minor garbage collection 會產(chǎn)生一個Stop the World Event,所有的應(yīng)用線程都會停止,直至這個Event結(jié)束。
Old Generation 是用來存儲活的長的Object的地方。閾值就是當(dāng)Young Generation內(nèi)某些達(dá)到一定的存活年齡。最終Old Generation也要被回收,這個回收事件就叫major garbage collection,它也是一個Stop the World Event,但是會很慢,因為涉及到所有的活的objects。
Permanent generation 包含一些Metadata,它產(chǎn)生于JVM的runtime。
-
Generational Garbage Collection Process
Object首先被分配到Eden, 兩個survior space 都是空的。
Slide13.png
當(dāng)eden space 滿了產(chǎn)生一個minor garbage collection

回收過程,Referenced objects移到第一個survivor space。其他的刪除

下一個minor garbage collection 的時候如下發(fā)生Unreferenced objects 被刪,referenced objects移到第二個survivor space,同時第一個survivor space內(nèi)存活的Object年齡會加一,S0 和 eden被清空

再到達(dá)下一次minor garbage collection

當(dāng)年齡達(dá)到一定程度,一些objects就會移到old generation,產(chǎn)生一個promotion

隨著minor GCs繼續(xù),更多的objects就會移到old generation

最后就會產(chǎn)生major GC回收old generation
參考文獻(xiàn)
http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html


