国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁 > 營銷資訊 > 網(wǎng)站運(yùn)營 > JVM基礎(chǔ)系列第6講:Java 虛擬機(jī)內(nèi)存結(jié)構(gòu)

JVM基礎(chǔ)系列第6講:Java 虛擬機(jī)內(nèi)存結(jié)構(gòu)

時(shí)間:2023-06-26 09:27:02 | 來源:網(wǎng)站運(yùn)營

時(shí)間:2023-06-26 09:27:02 來源:網(wǎng)站運(yùn)營

JVM基礎(chǔ)系列第6講:Java 虛擬機(jī)內(nèi)存結(jié)構(gòu):看到這里,我相信大家對于一個(gè) Java 源文件是如何變成字節(jié)碼文件,以及字節(jié)碼文件的含義已經(jīng)非常清楚了。那么接下來就是讓 Java 虛擬機(jī)運(yùn)行字節(jié)碼文件,從而得出我們最終想要的結(jié)果了。在這個(gè)過程中,Java 虛擬機(jī)會加載字節(jié)碼文件,將其存入 Java 虛擬機(jī)的內(nèi)存空間中,之后進(jìn)行一系列的初始化動作,最后運(yùn)行程序得出結(jié)果。

那么字節(jié)碼數(shù)據(jù)在 Java 虛擬機(jī)內(nèi)存中是如何存放的 ?Java 虛擬機(jī)在為類實(shí)例或成員變量分配內(nèi)存是如何分配的 ?要解答上面這些問題,我們首先需要了解一下 Java 虛擬機(jī)的內(nèi)存結(jié)構(gòu)。

其實(shí) Java 虛擬機(jī)的內(nèi)存結(jié)構(gòu)并不是官方的說法,在《Java 虛擬機(jī)規(guī)范》中用的是「運(yùn)行時(shí)數(shù)據(jù)區(qū)」這個(gè)術(shù)語。但很多時(shí)候這個(gè)名詞并不是很形象,再加上日積月累的習(xí)慣,我們都習(xí)慣用虛擬機(jī)內(nèi)存結(jié)構(gòu)這個(gè)說法了。

根據(jù)《Java 虛擬機(jī)規(guī)范》中的說法,Java 虛擬機(jī)的內(nèi)存結(jié)構(gòu)可以分為公有和私有兩部分。公有指的是所有線程都共享的部分,指的是 Java 堆、方法區(qū)、常量池。私有指的是每個(gè)線程的私有數(shù)據(jù),包括:PC寄存器、Java 虛擬機(jī)棧、本地方法棧。

公有部分:Java堆、方法區(qū)、常量池

在 Java 虛擬機(jī)中,線程共享部分包括 Java 堆、方法區(qū)及常量池。

Java 堆指的是從 JVM 劃分出來的一塊區(qū)域,這塊區(qū)域?qū)iT用于 Java 實(shí)例對象的內(nèi)存分配,幾乎所有實(shí)例對象都在會這里進(jìn)行內(nèi)存的分配。之所以說幾乎是因?yàn)橛刑厥馇闆r,有些時(shí)候小對象會直接在棧上進(jìn)行分配,這種現(xiàn)象我們稱之為「棧上分配」。這里并不深入介紹,后續(xù)有章節(jié)會介紹。

方法區(qū)指的是存儲 Java 類字節(jié)碼數(shù)據(jù)的一塊區(qū)域,它存儲了每一個(gè)類的結(jié)構(gòu)信息,例如運(yùn)行時(shí)常量池、字段和方法數(shù)據(jù)、構(gòu)造方法等??梢钥吹匠A砍仄鋵?shí)是存放在方法區(qū)中的,但《Java 虛擬機(jī)規(guī)范》將常量池和方法區(qū)放在同一個(gè)等級上,這點(diǎn)我們知曉即可。

方法區(qū)在不同版本的虛擬機(jī)有不同的表現(xiàn)形式,例如在 1.7 版本的 HotSpot 虛擬機(jī)中,方法區(qū)被稱為永久代(Permanent Space),而在 JDK 1.8 中則被稱之為 MetaSpace。

說完這幾個(gè)部分的大致作用之后,我們來深入說說 Java 堆。

Java 堆根據(jù)對象存活時(shí)間的不同,Java 堆還被分為年輕代、老年代兩個(gè)區(qū)域,年輕代還被進(jìn)一步劃分為 Eden 區(qū)、From Survivor 0、To Survivor 1 區(qū)。如下圖所示。

當(dāng)有對象需要分配時(shí),一個(gè)對象永遠(yuǎn)優(yōu)先被分配在年輕代的 Eden 區(qū),等到 Eden 區(qū)域內(nèi)存不夠時(shí),Java 虛擬機(jī)會啟動垃圾回收。此時(shí) Eden 區(qū)中沒有被引用的對象的內(nèi)存就會被回收,而一些存活時(shí)間較長的對象則會進(jìn)入到老年代。在 JVM 中有一個(gè)名為 -XX:MaxTenuringThreshold 的參數(shù)專門用來設(shè)置晉升到老年代所需要經(jīng)歷的 GC 次數(shù),即在年輕代的對象經(jīng)過了指定次數(shù)的 GC 后,將在下次 GC 時(shí)進(jìn)入老年代。

這里讓我們思考一個(gè)問題:為什么 Java 堆要進(jìn)行這樣一個(gè)區(qū)域劃分呢?

根據(jù)我們的經(jīng)驗(yàn),虛擬機(jī)中的對象必然有存活時(shí)間長的對象,也有存活時(shí)間短的對象,這是一個(gè)普遍存在的正態(tài)分布規(guī)律。如果我們將其混在一起,那么因?yàn)榇婊顣r(shí)間短的對象有很多,那么勢必導(dǎo)致較為頻繁的垃圾回收。而垃圾回收時(shí)不得不對所有內(nèi)存都進(jìn)行掃描,但其實(shí)有一部分對象,它們存活時(shí)間很長,對他們進(jìn)行掃描完全是浪費(fèi)時(shí)間。因此為了提高垃圾回收效率,分區(qū)就理所當(dāng)然了。

另外一個(gè)值得我們思考的問題是:為什么默認(rèn)的虛擬機(jī)配置,Eden:from :to = 8:1:1 呢?

其實(shí)這是 IBM 公司根據(jù)大量統(tǒng)計(jì)得出的結(jié)果。根據(jù) IBM 公司對對象存活時(shí)間的統(tǒng)計(jì),他們發(fā)現(xiàn) 80% 的對象存活時(shí)間都很短。于是他們將 Eden 區(qū)設(shè)置為年輕代的 80%,這樣可以減少內(nèi)存空間的浪費(fèi),提高內(nèi)存空間利用率。

私有部分:PC寄存器、Java 虛擬機(jī)棧、本地方法棧

Java 堆以及方法區(qū)的數(shù)據(jù)是共享的,但是有一些部分則是線程私有的。線程私有部分可以分為:PC 寄存器、Java 虛擬機(jī)棧、本地方法棧三大部分。

PC 寄存器,顧名思義 Program Counter 寄存器,指的是保存線程當(dāng)前正在執(zhí)行的方法。如果這個(gè)方法不是 native 方法,那么 PC 寄存器就保存 Java 虛擬機(jī)正在執(zhí)行的字節(jié)碼指令地址。如果是 native 方法,那么 PC 寄存器保存的值是 undefined。任意時(shí)刻,一條 Java 虛擬機(jī)線程只會執(zhí)行一個(gè)方法的代碼,而這個(gè)被線程執(zhí)行的方法稱為該線程的當(dāng)前方法,其地址被存在 PC 寄存器中。

Java 虛擬機(jī)棧,這個(gè)棧與線程同時(shí)創(chuàng)建,用來存儲棧幀,即存儲局部變量與一些過程結(jié)果的地方。棧幀存儲的數(shù)據(jù)包括:局部變量表、操作數(shù)棧。

當(dāng) Java 虛擬機(jī)使用其他語言(例如 C 語言)來實(shí)現(xiàn)指令集解釋器時(shí),也會使用到本地方法棧。如果 Java 虛擬機(jī)不支持 natvie 方法,并且自己也不依賴傳統(tǒng)棧的話,可以無需支持本地方法棧。

總結(jié)

Java 虛擬機(jī)的內(nèi)存結(jié)構(gòu)是學(xué)習(xí)虛擬機(jī)所必須掌握的地方,其中以 Java 堆的內(nèi)存模型最為重要,因?yàn)榫€上問題很多時(shí)候都是 Java 堆出現(xiàn)問題。因此掌握 Java 堆的劃分以及常用參數(shù)的調(diào)整最為關(guān)鍵。

除了上述所說的六大部分之外,其實(shí)在 Java 中還有直接內(nèi)存、棧幀等數(shù)據(jù)結(jié)構(gòu)。但因?yàn)橹苯觾?nèi)存、棧幀的使用場景還比較少,所以這里并不做介紹,以免讓初學(xué)者一時(shí)間混淆。

學(xué)到這里,一個(gè) Java 文件就加載到內(nèi)存中了,并且 Java 類信息就會存儲在我們的方法區(qū)中。如果創(chuàng)建對象,那么對象數(shù)據(jù)就會存放在 Java 堆中。如果調(diào)用方法,就會用到 PC 寄存器、Java 虛擬機(jī)棧、本地方法棧等結(jié)構(gòu)。那么面對如此之多的 Java 類,JVM 是如何決定這些類的加載順序,又是如此控制它們的加載的呢?下一節(jié),我們講講 JVM 的類加載機(jī)制。

JVM系列目錄








一個(gè)人可以走得更快,但一群人可以走得更遠(yuǎn)。歡迎加入博主的讀者交流群,獲取入群二維碼請關(guān)注「架構(gòu)師指南」回復(fù)「入群交流」獲取。群里有來自北上廣深的技術(shù)朋友,我們一同探討軟件開發(fā)的職業(yè)發(fā)展、日常生活、技術(shù)思維等。

關(guān)鍵詞:結(jié)構(gòu),虛擬,基礎(chǔ),系列

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點(diǎn)擊下載Chrome瀏覽器
關(guān)閉