java虛擬機(jī)的工作原理

  1. JVM 內(nèi)存結(jié)構(gòu)


    Hotspot Achitecture.png

    需要用來調(diào)優(yōu)的主要就是堆和垃圾回收器,基于兩個方面調(diào)優(yōu),一個是Responsiveness, 一個是Throughput(例如一次做多執(zhí)行多少次transaction)

  2. 自動垃圾回收
    第一步標(biāo)記已經(jīng)使用過的內(nèi)存


    Marking.png

    第二步刪除unreferenced objects

Slide1b.png

第三步壓縮

Slide4.png

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

ObjectLifetime.png

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

JVM Generations.png

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。

  1. Generational Garbage Collection Process
    Object首先被分配到Eden, 兩個survior space 都是空的。


    Slide13.png

當(dāng)eden space 滿了產(chǎn)生一個minor garbage collection


Slide14.png

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


Slide6.png

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

Slide8.png

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

Slide9.png

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

Slide7.png

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


Slide10.png

最后就會產(chǎn)生major GC回收old generation

參考文獻(xiàn)
http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容