本篇文章為大家展示了怎樣了解JVM內(nèi)存模型,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供新建網(wǎng)站建設(shè)、新建做網(wǎng)站、新建網(wǎng)站設(shè)計、新建網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、新建企業(yè)網(wǎng)站模板建站服務(wù),十年新建做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。
如果想了解JVM內(nèi)存模型,首先我們要知道JVM是什么?JVM全稱 Java Virtual Machine ,即Java虛擬機,是用于運行Java程序編譯后的字節(jié)碼文件。
JVM最常見的三種類型有:
1.Sun公司的 HotSpot,是目前使用最廣泛的Java虛擬機。
2.BEA公司的 JRockit,后來被 Oracle收購。
3.IBM公司的 J9VM。
我們知道,Java的口號是:“Write once, run anywhere”,即一次編寫,到處運行。為什么可以做到這樣呢,其實就是依賴于JVM。在不同的操作系統(tǒng)上,只要安裝了對應(yīng)的虛擬機,那么同樣的一份代碼,就可以隨意移植。
當(dāng)編寫完Java代碼時,即產(chǎn)生 .Java文件,會通過Java編譯器編譯為.class 文件,然后通過Class Loader把類信息加載到JVM中,最后JVM再去調(diào)用操作系統(tǒng)。這樣,只要JVM正確執(zhí)行.class文件,就可以實現(xiàn)跨平臺了。
以下即為JVM的內(nèi)存模型圖:
程序計數(shù)器:
程序計數(shù)器是一塊較小的內(nèi)存,可以看做是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號指示器,即記錄當(dāng)前線程所執(zhí)行到的字節(jié)碼的行號。當(dāng)字節(jié)碼解釋器工作時,就是通過改變計數(shù)器的值來選取下一條需要執(zhí)行的字節(jié)碼指令。由此來完成分支、循環(huán)、跳轉(zhuǎn)、線程恢復(fù)、異常處理等功能。
程序計數(shù)器是線程私有的(即每個線程擁有一個程序計數(shù)器),各個線程之間的程序計數(shù)器互不干擾。程序計數(shù)器的生命周期跟隨線程的生命周期,若線程消亡,則程序計數(shù)器也會消亡。
如果一個線程正在執(zhí)行的是Java方法,則程序計數(shù)器記錄的是正在執(zhí)行的字節(jié)碼指令的地址;如果正在執(zhí)行的是 native 本地方法,則程序計數(shù)器記錄的是 Undefined .
棧
指的是Java虛擬機棧,它也是線程私有的,因此生命周期和線程相同。每當(dāng)線程創(chuàng)建的時候,都會創(chuàng)建一個私有的Java虛擬機棧。Java棧中保存了局部變量和方法參數(shù)等,同時和Java方法的調(diào)用、返回密切相關(guān)。
每個方法在執(zhí)行的同時都會創(chuàng)建一個棧幀,用于存儲局部變量表、操作數(shù)棧、動態(tài)鏈接、方法出口等信息。每一個方法從調(diào)用到執(zhí)行完成的過程,就對應(yīng)一個棧幀在虛擬機棧中從入棧到出棧的過程。
本地方法棧
本地方法棧和Java虛擬機棧非常類似,它們最大的不同在于,Java虛擬機棧用于Java方法的調(diào)用,而本地方法棧用于Native本地方法的調(diào)用。
堆
Java堆是所有線程共享的一塊內(nèi)存區(qū)域,在虛擬機啟動時創(chuàng)建。對于絕大多數(shù)應(yīng)用來說,Java堆是JVM所管理的內(nèi)存中最大的一塊,幾乎所有的對象實例和數(shù)組都存放在這里。
Java堆也是垃圾收集器管理的主要區(qū)域。堆中分為新生代、老年代和永久代,新生代還可細(xì)分為Eden區(qū)、From、To 區(qū)。當(dāng)堆中沒有內(nèi)存可分配時,就會拋出OOM異常。
方法區(qū)
方法區(qū)同Java堆一樣,也是所有線程共享的內(nèi)存區(qū)域。用于存儲已被虛擬機加載的類信息、常量、靜態(tài)變量、即時編譯器編譯后的代碼等數(shù)據(jù)。在JDK8以前,HotSpot是用“永久代”來實現(xiàn)方法區(qū)的,其他虛擬機(如JRockit、J9VM)不存在永久代這個概念。這樣的話,方法區(qū)可以和Java堆一樣被 HotSpot的垃圾收集器所管理,不需要單獨處理。
由于我們可以通過 -XX:MaxPermSize 來設(shè)置永久代大小,因此若使用永久代來實現(xiàn)方法區(qū),則會有內(nèi)存溢出的風(fēng)險。因此,在JDk8中,取消了永久代,用元空間代替之。也就是說,用元空間來實現(xiàn)方法區(qū)。
元空間的本質(zhì)和永久代類似,都是對JVM規(guī)范中方法區(qū)的實現(xiàn)。元空間與永久代之間最大的區(qū)別在于:永久代是堆的一部分,和新生代,老年代地址是連續(xù)的。元空間并不在虛擬機中,而屬于 Native Memeory(本地內(nèi)存)。因此,默認(rèn)情況下,元空間的大小僅受本地內(nèi)存限制。
運行時常量池
首先需要知道常量池和運行時常量池的區(qū)別。
常量池,即指class文件常量池,是class文件的一部分。java文件被編譯成class文件之后,除了包含了類的版本、字段、方法、接口等描述信息,還有一項信息叫做class文件常量池。其用于存放編譯期生成的各種字面量和符號引用。
運行時常量池是方法區(qū)的一部分。當(dāng)類加載到內(nèi)存中,JVM就會將class文件常量池中的內(nèi)容(字面量和符號引用)存放到運行時常量池中。
Java并不要求常量一定只有在編譯期才可以產(chǎn)生,在運行期間也可以產(chǎn)生新的常量并放入池中。
直接內(nèi)存
Java的NIO庫允許Java程序使用直接內(nèi)存。直接內(nèi)存是Java堆外的,直接向系統(tǒng)申請的一塊內(nèi)存空間(直接內(nèi)存不屬于虛擬機運行時數(shù)據(jù)區(qū))。因此,直接內(nèi)存的大小不受虛擬機的限制,只受本機內(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://www.chinadenli.net/article10/gecjgo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、網(wǎng)站建設(shè)、企業(yè)網(wǎng)站制作、網(wǎng)站設(shè)計、微信小程序、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)