各位父老鄉(xiāng)親兄弟姐妹們。周末到了,講道理今天不應(yīng)該跟大家聊這種索然無味的技術(shù)梗。但是既然開了頭不能虎頭蛇尾的。也到了這個系列的最后一塊——方法區(qū)。昨天我們也預(yù)告了,那既然放出話了就肯定要把諾言實(shí)現(xiàn)。我們今天就把這個系列給完結(jié)了。今天我們來聊聊JVM中的方法區(qū)(Method Area)。
方法區(qū)概述
我們用幾個點(diǎn)來概括一下方法區(qū)是個什么東西和有什么用途。
方法區(qū)跟昨天介紹的堆都是各線程共享的內(nèi)存區(qū)域。方法區(qū)主要是存儲已經(jīng)被虛擬機(jī)加載的類信息、常量、靜態(tài)變量、即時編譯器編譯后的代碼和數(shù)據(jù)。
Java虛擬機(jī)中也有把方法區(qū)描述為堆的一個邏輯部分,但是它有一個別名叫做Non-Heap【非堆】,目的就是與Java堆區(qū)分開來。
對HotSpot虛擬機(jī)開發(fā)者來說,方法區(qū)也稱為是永久代(Permanent Generation),其實(shí)在本質(zhì)上二者不等價,僅僅是因為HotSpot的團(tuán)隊把GC分代收集擴(kuò)展至方法區(qū),或者說使用永久代來實(shí)現(xiàn)方法區(qū)。節(jié)省了專門為方法區(qū)編寫內(nèi)存管理代碼的工作。
對于其他虛擬機(jī)(BEA JRockit、IBM J9等)來說是不存在永久代的概念。
使用永久代來實(shí)現(xiàn)方法區(qū)更容易出現(xiàn)內(nèi)存溢出問題(永久代有-XX:MaxPermSize的上限,J9和JRockit只要沒有觸碰到進(jìn)程可用的內(nèi)存上限就不會出現(xiàn)問題)。
當(dāng)方法區(qū)無法滿足內(nèi)存分配的需求時,將拋出OutOfMemoryError異常,這時候你的程序一般也就掛了。
Java虛擬機(jī)規(guī)范對于方法區(qū)的限制非常寬松。只要滿足下面的三個條件即可:
不需要連續(xù)內(nèi)存
可選擇固定大小或者可擴(kuò)展
不實(shí)現(xiàn)垃圾收集
運(yùn)行時常量池(Runtime Constant Pool)
運(yùn)行時常量池是方法區(qū)的一部分。用于存放編譯期生成的各種字面量和符號引用,這部分內(nèi)容將在類加載后進(jìn)入方法區(qū)的運(yùn)行時常量池。
Java虛擬機(jī)對于Class文件的每一部分的格式都有嚴(yán)格規(guī)定,但是對于運(yùn)行時常量池Java虛擬機(jī)規(guī)范沒有做出任何細(xì)節(jié)的要求。
一般來說,除了保存Class文件中描述的符號引用外,還會把翻譯出來的直接引用也存儲在運(yùn)行時常量池。
運(yùn)行時常量池相對于Class文件常量池的另一個重要的特征是動態(tài)性。運(yùn)行期間也可能將新的常亮放到池中。
運(yùn)行時常量池是方法區(qū)的一部分。也會出現(xiàn)OutOfMemoryError。
到這里我們關(guān)于JVM的所有區(qū)域介紹都已經(jīng)說完了。下面我們把剩下的最后的一個跟JVM虛擬機(jī)有類似的功能。也是大家經(jīng)常見到的區(qū)塊——直接內(nèi)存。嚴(yán)格意義上來說直接內(nèi)存跟JVM無關(guān)。但是我們還是提一提吧。在特定的功能下還是很有了解的必要的。
直接內(nèi)存(Direct Memory)
直接內(nèi)存并不是虛擬機(jī)運(yùn)行時數(shù)據(jù)區(qū)的一部分。也不是Java虛擬機(jī)規(guī)范中定義的內(nèi)存區(qū)域。
JDK1.4新加入的NIO類,引入了基于通道(Channel)與緩沖區(qū)(Buffer)的I/O方式。它可以使用Native函數(shù)庫直接分配堆外內(nèi)存。然后通過一個存儲在Java堆中的DirectByteBuffer對象作為這塊內(nèi)存的引用進(jìn)行操作。
直接內(nèi)存的分配不會受到Java堆大小的限制。但是會受到本機(jī)總內(nèi)存大小以及處理器尋址空間的限制。
到這里我們所有的關(guān)于JVM的介紹都已經(jīng)說完了。這周的工作時間內(nèi)都在總結(jié)這幾塊的關(guān)系。后面我們會對各種工作中遇到的問題總結(jié)出來分享給大家。希望大家別踩我踩過的坑。也祝大家周末愉快。
我的文章每天都會在頭條號首發(fā),然后第二天轉(zhuǎn)發(fā)到簡書中,希望有興趣的朋友可以關(guān)注我的頭條號:[Bug制造機(jī)]
(https://www.toutiao.com/c/user/51553105950/#mid=1582105392193550)。謝謝大家的支持。