1. 程式人生 > >JVM的方法區和永久帶的關係

JVM的方法區和永久帶的關係

群裡面有小夥伴問到這個問題,說在網上看了很多文章,但是還是沒弄明白這倆是啥關係,下面我們就來詳細的解釋一下:

什麼是方法區?

方法區(Method Area)是jvm規範裡面的執行時資料區的一個組成部分,jvm規範中的執行時資料區還包含了:pc暫存器、虛擬機器棧、堆、方法區、執行時常量池、本地方法棧。

方法區儲存東西?

主要用來儲存class、執行時常量池、欄位、方法、程式碼、JIT程式碼等。

注意:

(1)執行時資料區跟記憶體不是一個概念。

(2)方法區是執行時資料區的一部分

(3)方法區是jvm規範中的一部分,並不是實際的實現,切忌將規範跟實現混為一談。

我們再來看下永久帶(Perm區):

永久帶又叫Perm區,只存在於hotspot jvm中,並且只存在於jdk7和之前的版本中,jdk8中已經徹底移除了永久帶,jdk8中引入了一個新的記憶體區域叫metaspace。

(1)並不是所有的jvm中都有永久帶,ibm的j9,oracle的JRocket都沒有永久帶。

(2)永久帶是實現層面的東西。

(3)永久帶裡面存的東西基本上就是方法區規定的那些東西。

因此,我們可以說,永久帶是方法區的一種實現,當然,在hotspot jdk8中metaspace可以看成是方法區的一種實現。

下面我們來看下hotspot jdk8中移除了永久帶以後的記憶體結構:

https://img2.mukewang.com/5b59198f000159c905450385.jpg

結論:

(1)方法區是規範層面的東西,規定了這一個區域要存放哪些東西

(2)永久帶或者是metaspace是對方法區的不同實現,是實現層面的東西。

更多關於jvm記憶體相關的話題,包括記憶體結構、各種垃圾收集器、如何做GC調優等可以觀看我的一個視訊課程:Java生產環境下效能監控與調優詳解 以上,希望對你能有點用處。