1 內(nèi)存管理
1.1 方法區(qū)(Method Area)
-
存放
- 類的信息(類名/修飾符/類中字段和方法等)
- 靜態(tài)變量
- 構(gòu)造函數(shù)
- final常量
-
GC
對(duì)應(yīng)持久代(Permanent Generation)。方法區(qū)是全局共享的,在一定條件下也會(huì)被GC。當(dāng)方法區(qū)超過(guò)它允許的大小時(shí),就會(huì)拋出OutOfMemory:PermGen Space異常。
1.2 堆區(qū)(Heap)
-
存放
- 對(duì)象實(shí)例
- 數(shù)組
- 所有new出來(lái)的對(duì)象
-
GC
GC最頻繁的區(qū)域
1.3 虛擬機(jī)棧(VM Stack)
-
存放
每個(gè)方法被執(zhí)行時(shí)產(chǎn)生的一個(gè)棧幀(Statck Frame)
GC 不需要進(jìn)行垃圾回收
-
異常
- 線程調(diào)用的棧深度大于虛擬機(jī)允許的最大深度,則拋出StackOverFlowError
- 內(nèi)存不足時(shí),拋出OutOfMemoryError
1.4 本地方法棧(Native Method Stack)
本地方法棧用于支持native方法的執(zhí)行,存儲(chǔ)了每個(gè)native方法的執(zhí)行狀態(tài)。本地方法棧和虛擬機(jī)棧他們的運(yùn)行機(jī)制一致,唯一的區(qū)別是,虛擬機(jī)棧執(zhí)行Java方法,本地方法棧執(zhí)行native方法。
- GC 不需要進(jìn)行垃圾回收
1.5 程序計(jì)數(shù)器(Program Counter Register)
- GC 不需要進(jìn)行垃圾回收
2 垃圾回收GC
2.1 四種引用類型
- 強(qiáng)引用 - 存在引用則不會(huì)被回收
- 軟引用 - 內(nèi)存不足時(shí)會(huì)被回收
- 弱引用 - 每次GC時(shí)會(huì)被回收
- 虛引用 - 忽略不計(jì)
2.2 分區(qū)
新生代(Youn Generation):大致分為Eden區(qū)和Survivor區(qū),Survivor區(qū)又分為大小相同的兩部分:FromSpace和ToSpace。新建的對(duì)象都是從新生代分配內(nèi)存,Eden區(qū)不足的時(shí)候,會(huì)把存活的對(duì)象轉(zhuǎn)移到Survivor區(qū)。當(dāng)新生代進(jìn)行垃圾回收時(shí)會(huì)出發(fā)Minor GC(也稱作Youn GC)。
舊生代(Old Generation):舊生代用于存放新生代多次回收依然存活的對(duì)象,如緩存對(duì)象。當(dāng)舊生代滿了的時(shí)候就需要對(duì)舊生代進(jìn)行回收,舊生代的垃圾回收稱作Major GC(也稱作Full GC)。
持久代(Permanent Generation):在Sun 的JVM中就是方法區(qū)的意思,盡管大多數(shù)JVM沒(méi)有這一代。
2.3 GC算法
-
復(fù)制(新生代)
將存活對(duì)象移動(dòng)到一塊空閑區(qū)域中,需要額外的空間
-
標(biāo)記-清除
掃描標(biāo)記存活對(duì)象,再掃描未被標(biāo)記的對(duì)象進(jìn)行清除,會(huì)造成內(nèi)存碎片
-
標(biāo)記-壓縮(舊生代)
掃描標(biāo)記存活對(duì)象,再掃描未被標(biāo)記的對(duì)象進(jìn)行清除,清除后將存活對(duì)象向左端空閑空間移動(dòng),增加了移動(dòng)成本