JVM 內(nèi)存模型筆記

最近在看 《深入理解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í)間。


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

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

  • JVM內(nèi)存模型Java虛擬機(jī)(Java Virtual Machine=JVM)的內(nèi)存空間分為五個(gè)部分,分別是: ...
    光劍書架上的書閱讀 2,775評(píng)論 2 26
  • 一 、java虛擬機(jī)底層結(jié)構(gòu)詳解 我們知道,一個(gè)JVM實(shí)例的行為不光是它自己的事,還涉及到它的子系統(tǒng)、存儲(chǔ)區(qū)域、...
    葡萄喃喃囈語閱讀 1,582評(píng)論 0 4
  • jvm:Java Virtual Machine(Java虛擬機(jī)的縮寫)是java實(shí)現(xiàn)跨平臺(tái)的核心支持,鏈接硬件和...
    4ea0af17fd67閱讀 714評(píng)論 0 0
  • JVM架構(gòu) 當(dāng)一個(gè)程序啟動(dòng)之前,它的class會(huì)被類裝載器裝入方法區(qū)(Permanent區(qū)),執(zhí)行引擎讀取方法區(qū)的...
    cocohaifang閱讀 1,845評(píng)論 0 7
  • 最近有本職場(chǎng)劇特別火 不知道大家看了沒 反正我一開始只是沖著戚薇的顏去的 一口氣刷了好幾集發(fā)現(xiàn)這劇簡(jiǎn)直有毒 劇中臺(tái)...
    逗一點(diǎn)閱讀 370評(píng)論 0 1

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