柚子快報激活碼778899分享:JVM規(guī)范中的運行時數(shù)據(jù)區(qū)
柚子快報激活碼778899分享:JVM規(guī)范中的運行時數(shù)據(jù)區(qū)
?作者簡介:大家好,我是Leo,熱愛Java后端開發(fā)者,一個想要與大家共同進步的男人?? ?個人主頁:Leo的博客 ?當前專欄:每天一個知識點 ?特色專欄: MySQL學習 省本文內(nèi)容:JVM規(guī)范中的運行時數(shù)據(jù)區(qū) ?個人知識庫: Leo知識庫,歡迎大家訪問
JVM規(guī)范數(shù)據(jù)區(qū)
The pc Register(程序計數(shù)器): 是一塊較小的內(nèi)存空間,此計數(shù)器記錄的是正在執(zhí)行的虛擬機字節(jié)碼指令的地址;Java Virtual Machine Stacks(Java虛擬機棧): Java虛擬機棧用于存儲棧幀。棧幀用于存儲局部變量表、操作數(shù)棧、動態(tài)鏈接、方法出口等信息。Heap(堆): 是Java虛擬機所管理的最大的一塊內(nèi)存。堆內(nèi)存用于存放Java對象實例以及數(shù)組。堆是垃圾收集器收集垃圾的主要區(qū)域。Method Area(方法區(qū)): 用于存儲已被虛擬機加載的類信息、常量、靜態(tài)變量、即時編譯器編譯后的代碼等數(shù)據(jù)。Run-Time Constant Pool(運行時常量池): 是方法區(qū)的一部分,用于存放編譯期生成的各種字面量與符號引用。Native Method Stacks(本地方法棧): 在本地方法的執(zhí)行過程中,會使用到本地方法棧。和 Java 虛擬機棧十分相似。
總結(jié): 這些運行時數(shù)據(jù)區(qū)雖然在功能上有所區(qū)別,但在整個 Java 虛擬機啟動時都需要被創(chuàng)建,并且在虛擬機運行期間始終存在,直到虛擬機停止運行時被銷毀。同時,不同的 JVM 實現(xiàn)對運行時數(shù)據(jù)區(qū)的分配和管理方式也可能不同,會對性能和功能產(chǎn)生影響。
下圖為JVM結(jié)構(gòu)規(guī)范圖,該圖屬于JVM規(guī)范,不是具體的實現(xiàn)。JVM規(guī)范最開始是由研究Java的大佬們定制的,但是后面JVM規(guī)范的實現(xiàn)可能有很多公司,比如我們最熟悉的Oracle等等,這點一定要區(qū)分開。
JVM規(guī)范的實現(xiàn):HotSpot(Oracle JDK/Open JDK內(nèi)部使用的JVM就是HotSpot)
JDK6的HotSpot
JDK6的HotSpot大致分為以下幾個數(shù)據(jù)區(qū)。
年輕代: 剛new出來的對象放在這里。老年代: 經(jīng)過垃圾回收之后仍然存活的對象。符號引用: 類全名,字段全名,方法全名等。這個時期的永久代和堆是相鄰的,使用連續(xù)的物理內(nèi)存,但是內(nèi)存空間是隔離的。永久代的垃圾收集是和老年代捆綁在一起的,因此無論誰滿了,都會觸發(fā)永久代和老年代的垃圾收集。
JDK7的HotSpot
以下是JDK7的HotSpot,這是一個過渡的版本,該版本相對于JDK6來說,變化如下:
類的靜態(tài)變量轉(zhuǎn)移到堆中了。(這就是各個版本實現(xiàn)的不同,在JVM規(guī)范以及JDK6來說,類的靜態(tài)變量是在方法區(qū)中,而在JDK7中,類的靜態(tài)變量在堆內(nèi)存中。)字符串常量池轉(zhuǎn)移到堆中了。運行時常量池中的符號引用轉(zhuǎn)移到本地內(nèi)存了。
JDK8的HotSpot
以下是JDK8及更高版本的HotSpot,相對于JDK7來說發(fā)生了如下變化:
徹底刪除永久代 (為了避免OOM錯誤的發(fā)生,方法區(qū)更名為元空間)。將方法區(qū)的實現(xiàn)轉(zhuǎn)移到本地內(nèi)存。將符號引用重新放回運行時常量池。
柚子快報激活碼778899分享:JVM規(guī)范中的運行時數(shù)據(jù)區(qū)
參考閱讀
本文內(nèi)容根據(jù)網(wǎng)絡資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。