怎樣了解JVM內(nèi)存模型

本篇文章為大家展示了怎樣了解JVM內(nèi)存模型,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供新建網(wǎng)站建設(shè)、新建做網(wǎng)站、新建網(wǎng)站設(shè)計(jì)、新建網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、新建企業(yè)網(wǎng)站模板建站服務(wù),十年新建做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

如果想了解JVM內(nèi)存模型,首先我們要知道JVM是什么?JVM全稱 Java Virtual Machine ,即Java虛擬機(jī),是用于運(yùn)行Java程序編譯后的字節(jié)碼文件。

JVM最常見的三種類型有:
1.Sun公司的 HotSpot,是目前使用最廣泛的Java虛擬機(jī)。
2.BEA公司的 JRockit,后來被 Oracle收購。
3.IBM公司的 J9VM。

我們知道,Java的口號是:“Write once, run anywhere”,即一次編寫,到處運(yùn)行。為什么可以做到這樣呢,其實(shí)就是依賴于JVM。在不同的操作系統(tǒng)上,只要安裝了對應(yīng)的虛擬機(jī),那么同樣的一份代碼,就可以隨意移植。

當(dāng)編寫完Java代碼時(shí),即產(chǎn)生 .Java文件,會通過Java編譯器編譯為.class 文件,然后通過Class Loader把類信息加載到JVM中,最后JVM再去調(diào)用操作系統(tǒng)。這樣,只要JVM正確執(zhí)行.class文件,就可以實(shí)現(xiàn)跨平臺了。

以下即為JVM的內(nèi)存模型圖:

怎樣了解JVM內(nèi)存模型  
file

程序計(jì)數(shù)器:

程序計(jì)數(shù)器是一塊較小的內(nèi)存,可以看做是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號指示器,即記錄當(dāng)前線程所執(zhí)行到的字節(jié)碼的行號。當(dāng)字節(jié)碼解釋器工作時(shí),就是通過改變計(jì)數(shù)器的值來選取下一條需要執(zhí)行的字節(jié)碼指令。由此來完成分支、循環(huán)、跳轉(zhuǎn)、線程恢復(fù)、異常處理等功能。

程序計(jì)數(shù)器是線程私有的(即每個(gè)線程擁有一個(gè)程序計(jì)數(shù)器),各個(gè)線程之間的程序計(jì)數(shù)器互不干擾。程序計(jì)數(shù)器的生命周期跟隨線程的生命周期,若線程消亡,則程序計(jì)數(shù)器也會消亡。

如果一個(gè)線程正在執(zhí)行的是Java方法,則程序計(jì)數(shù)器記錄的是正在執(zhí)行的字節(jié)碼指令的地址;如果正在執(zhí)行的是 native 本地方法,則程序計(jì)數(shù)器記錄的是 Undefined .

指的是Java虛擬機(jī)棧,它也是線程私有的,因此生命周期和線程相同。每當(dāng)線程創(chuàng)建的時(shí)候,都會創(chuàng)建一個(gè)私有的Java虛擬機(jī)棧。Java棧中保存了局部變量和方法參數(shù)等,同時(shí)和Java方法的調(diào)用、返回密切相關(guān)。

每個(gè)方法在執(zhí)行的同時(shí)都會創(chuàng)建一個(gè)棧幀,用于存儲局部變量表、操作數(shù)棧、動(dòng)態(tài)鏈接、方法出口等信息。每一個(gè)方法從調(diào)用到執(zhí)行完成的過程,就對應(yīng)一個(gè)棧幀在虛擬機(jī)棧中從入棧到出棧的過程。

本地方法棧

本地方法棧和Java虛擬機(jī)棧非常類似,它們最大的不同在于,Java虛擬機(jī)棧用于Java方法的調(diào)用,而本地方法棧用于Native本地方法的調(diào)用。

Java堆是所有線程共享的一塊內(nèi)存區(qū)域,在虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建。對于絕大多數(shù)應(yīng)用來說,Java堆是JVM所管理的內(nèi)存中最大的一塊,幾乎所有的對象實(shí)例和數(shù)組都存放在這里。

Java堆也是垃圾收集器管理的主要區(qū)域。堆中分為新生代、老年代和永久代,新生代還可細(xì)分為Eden區(qū)、From、To 區(qū)。當(dāng)堆中沒有內(nèi)存可分配時(shí),就會拋出OOM異常。

方法區(qū)

方法區(qū)同Java堆一樣,也是所有線程共享的內(nèi)存區(qū)域。用于存儲已被虛擬機(jī)加載的類信息、常量、靜態(tài)變量、即時(shí)編譯器編譯后的代碼等數(shù)據(jù)。在JDK8以前,HotSpot是用“永久代”來實(shí)現(xiàn)方法區(qū)的,其他虛擬機(jī)(如JRockit、J9VM)不存在永久代這個(gè)概念。這樣的話,方法區(qū)可以和Java堆一樣被 HotSpot的垃圾收集器所管理,不需要單獨(dú)處理。

由于我們可以通過 -XX:MaxPermSize 來設(shè)置永久代大小,因此若使用永久代來實(shí)現(xiàn)方法區(qū),則會有內(nèi)存溢出的風(fēng)險(xiǎn)。因此,在JDk8中,取消了永久代,用元空間代替之。也就是說,用元空間來實(shí)現(xiàn)方法區(qū)。

元空間的本質(zhì)和永久代類似,都是對JVM規(guī)范中方法區(qū)的實(shí)現(xiàn)。元空間與永久代之間最大的區(qū)別在于:永久代是堆的一部分,和新生代,老年代地址是連續(xù)的。元空間并不在虛擬機(jī)中,而屬于 Native Memeory(本地內(nèi)存)。因此,默認(rèn)情況下,元空間的大小僅受本地內(nèi)存限制。

運(yùn)行時(shí)常量池

首先需要知道常量池和運(yùn)行時(shí)常量池的區(qū)別。

常量池,即指class文件常量池,是class文件的一部分。java文件被編譯成class文件之后,除了包含了類的版本、字段、方法、接口等描述信息,還有一項(xiàng)信息叫做class文件常量池。其用于存放編譯期生成的各種字面量和符號引用。

怎樣了解JVM內(nèi)存模型  
file

運(yùn)行時(shí)常量池是方法區(qū)的一部分。當(dāng)類加載到內(nèi)存中,JVM就會將class文件常量池中的內(nèi)容(字面量和符號引用)存放到運(yùn)行時(shí)常量池中。

Java并不要求常量一定只有在編譯期才可以產(chǎn)生,在運(yùn)行期間也可以產(chǎn)生新的常量并放入池中。

直接內(nèi)存

Java的NIO庫允許Java程序使用直接內(nèi)存。直接內(nèi)存是Java堆外的,直接向系統(tǒng)申請的一塊內(nèi)存空間(直接內(nèi)存不屬于虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū))。因此,直接內(nèi)存的大小不受虛擬機(jī)的限制,只受本機(jī)內(nèi)存的限制。通常訪問直接內(nèi)存的速度會快于訪問堆的速度。

上述內(nèi)容就是怎樣了解JVM內(nèi)存模型,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)站名稱:怎樣了解JVM內(nèi)存模型
文章網(wǎng)址:http://muchs.cn/article10/gecjgo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈網(wǎng)站建設(shè)、企業(yè)網(wǎng)站制作網(wǎng)站設(shè)計(jì)、微信小程序、網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)