JVM的方法區和永久帶的關係
阿新 • • 發佈:2018-12-11
群裡面有小夥伴問到這個問題,說在網上看了很多文章,但是還是沒弄明白這倆是啥關係,下面我們就來詳細的解釋一下:
什麼是方法區?
方法區(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中移除了永久帶以後的記憶體結構:
結論:
(1)方法區是規範層面的東西,規定了這一個區域要存放哪些東西
(2)永久帶或者是metaspace是對方法區的不同實現,是實現層面的東西。
更多關於jvm記憶體相關的話題,包括記憶體結構、各種垃圾收集器、如何做GC調優等可以觀看我的一個視訊課程:Java生產環境下效能監控與調優詳解 以上,希望對你能有點用處。