最近在看 《深入理解Java虛擬機(jī)》,準(zhǔn)備邊看書、邊結(jié)合一些收集的資料以及自己在工作中的實(shí)踐寫一系列學(xué)習(xí)和總結(jié)的筆記,本篇文章為該系列的第一篇文章。
內(nèi)存模型
書中和網(wǎng)絡(luò)上都會(huì)通過(圖1)描述JAVA的內(nèi)存模型,內(nèi)存中保存的數(shù)據(jù)即為運(yùn)行時(shí)數(shù)據(jù)區(qū),運(yùn)行時(shí)數(shù)據(jù)區(qū)包含兩類數(shù)據(jù):
1.共享數(shù)據(jù)
? ? ? a. 方法區(qū):靜態(tài)變量、常量、加載的類信息等,永久代(PermGen)所屬的區(qū)域;
? ? ? b. 堆區(qū):實(shí)例對(duì)象和數(shù)組分配數(shù)據(jù)的區(qū)域,內(nèi)存優(yōu)化,GC回收優(yōu)化基本上就是在對(duì)該區(qū)域做優(yōu)化
? ? 2.線程獨(dú)有數(shù)據(jù)
? ? ? a.虛機(jī)棧:線程的變量、引用等數(shù)據(jù);
? ? ? b.本地方法棧:調(diào)用非JAVA代碼時(shí)候的內(nèi)存數(shù)據(jù),在有的JVM中,本地方法棧和虛機(jī)棧的處理是一致的
? ? ? c.程序計(jì)數(shù)器:保存當(dāng)前線程執(zhí)行指令的位置,計(jì)算機(jī)原理中常規(guī)的計(jì)數(shù)器的概念一致。
JVM這種內(nèi)存模型設(shè)計(jì)的個(gè)人理解:JVM這樣設(shè)計(jì)內(nèi)存模型也是根據(jù)我們程序中的數(shù)據(jù)類型來區(qū)分的,和其他編程語言使用的內(nèi)存模型基本上一致。堆區(qū)、棧區(qū)和全局?jǐn)?shù)據(jù)區(qū),堆區(qū)用來在內(nèi)存上動(dòng)態(tài)分配數(shù)據(jù),棧區(qū)是每個(gè)線程所獨(dú)有的數(shù)據(jù),這里JVM根據(jù)數(shù)據(jù)類型又把棧區(qū)分為了三類,我覺得這是和JAVA這種依賴虛機(jī)語言特點(diǎn)的一種設(shè)計(jì),內(nèi)置數(shù)據(jù)類型必然和本地方法需要的數(shù)據(jù)類型在內(nèi)存中存放的方式不一致有關(guān)系。
GC回收機(jī)制
這里主要簡(jiǎn)單記錄一下堆空間的GC回收,在JVM中內(nèi)存回收并不是一次性就完成的,而是將堆空間分為新生代和老年代,通過兩次GC回收完成數(shù)據(jù)的回收,這種設(shè)計(jì)個(gè)人理解是和內(nèi)存回收算法(關(guān)于GC回收的算法可以通Java垃圾回收機(jī)制簡(jiǎn)單了解)以及防止內(nèi)存碎片產(chǎn)生有關(guān)的。
在堆空間中分為新生代和老年代,而新生代又分為eden、s0和s1(同一時(shí)刻,s0和s1只有其中一個(gè)區(qū)域存放著數(shù)據(jù))。
新生代GC(Minor GC):當(dāng)eden中內(nèi)存不夠用的時(shí)候就會(huì)觸發(fā)一次GC回收(可以簡(jiǎn)單這么理解,因?yàn)樵贘VM設(shè)計(jì)中GC回收的觸發(fā)是一個(gè)很復(fù)雜的策略,具體觸發(fā)是有system決定的,老年代GC類似),這個(gè)時(shí)候采用的是復(fù)制算法,假如當(dāng)前s0存放著數(shù)據(jù),則會(huì)將eden和s0中還在使用的數(shù)據(jù)拷貝到s1中,并清空eden和s0,采用復(fù)制算法的優(yōu)點(diǎn)就是快速,所以新生代會(huì)頻繁進(jìn)行GC。在上面那個(gè)過程中的,拷貝的數(shù)據(jù)年齡會(huì)被加1,當(dāng)年齡達(dá)到一定程度的時(shí)候,數(shù)據(jù)會(huì)被回收的老年代。
老年代GC(Major GC? / Full GC):當(dāng)老年代的內(nèi)存不夠的時(shí)候,觸發(fā)一次老年代的內(nèi)存回收,這個(gè)時(shí)候就不能用復(fù)制算法了,這樣就需要消耗等量的內(nèi)存來實(shí)現(xiàn)復(fù)制算法,此時(shí)使用的是標(biāo)記壓縮算法,而標(biāo)記壓縮算法是一個(gè)緩慢的過程。
所以不是直接將內(nèi)存劃分成一塊區(qū)域,同時(shí)進(jìn)行GC操作,而是根據(jù)內(nèi)存回收頻率分成兩塊,頻繁回收和不頻繁回收的,頻繁回收的用空間換時(shí)間。

