資料內(nèi)容:
本地方法棧(Native Method Stacks)
本地方法棧與虛擬機(jī)棧所發(fā)揮的作用是非常相似的,其區(qū)別不過(guò)是虛擬機(jī)棧為虛擬機(jī)執(zhí)行
Java方法(也就是字節(jié)碼)
服務(wù),而本地方法棧則是為虛擬機(jī)使用到的Native方法服務(wù)。
虛擬機(jī)規(guī)范中對(duì)本地方法棧中的方法使用的語(yǔ)言、使用方式與數(shù)據(jù)結(jié)構(gòu)并沒(méi)有強(qiáng)制規(guī)定,因此具體的虛擬機(jī)可以自
由實(shí)現(xiàn)它。甚至有的虛擬機(jī)(譬如Sun HotSpot虛擬機(jī))直接就把本地方法棧和虛擬機(jī)棧合二為一。與虛擬機(jī)棧一樣,
本地方法棧區(qū)域也會(huì)拋出StackOverflowError和OutOfMemoryError異常。
什么是Native Method?簡(jiǎn)單地講,一個(gè)Native Method就是一個(gè)java調(diào)用非java代碼的接口。一個(gè)Native Method
是這樣一個(gè)java的方法:該方法的實(shí)現(xiàn)由非java語(yǔ)言實(shí)現(xiàn),比如C。這個(gè)特征并非java所特有,很多其它的編程
語(yǔ)言都有這一機(jī)制,比如在C++中,你可以用extern "C"告知C++編譯?去調(diào)用一個(gè)C的函數(shù)。
方法區(qū)(MethodArea)
方法區(qū)也是一塊被重點(diǎn)關(guān)注的區(qū)域,主要特點(diǎn)如下:
線(xiàn)程共享區(qū)域,因此這是線(xiàn)程不安全的區(qū)域。
它用于存儲(chǔ)已被虛擬機(jī)加載的類(lèi)信息、常量、靜態(tài)變量、即時(shí)編譯?編譯后的代碼等數(shù)據(jù)。當(dāng)
方法區(qū)無(wú)法滿(mǎn)足內(nèi)存分配需求時(shí),將拋出OutOfMemoryError異常。
雖然Java虛擬機(jī)規(guī)范把方法區(qū)描述為堆的一個(gè)邏輯部分,但是它卻有一個(gè)別名叫做Non-Heap(非堆),目的應(yīng)該是
與Java堆區(qū)分開(kāi)來(lái)。對(duì)于習(xí)慣在HotSpot虛擬機(jī)上開(kāi)發(fā)和部署程序的開(kāi)發(fā)者來(lái)說(shuō),很多人愿意把方法區(qū)稱(chēng)為“永久代”
(Permanent Generation),本質(zhì)上兩者并不等價(jià),那么他們之間的區(qū)別到底是什么?方法區(qū)是Java虛擬機(jī)規(guī)范中的定
義,是一種規(guī)范,而永久代是一種實(shí)現(xiàn),一個(gè)是標(biāo)準(zhǔn)一個(gè)是實(shí)現(xiàn)。不過(guò)Java 8以后就沒(méi)有永久代這個(gè)說(shuō)法了,元空間
取代了永久代。
Java虛擬機(jī)規(guī)范對(duì)這個(gè)區(qū)域的限制非常寬松,除了和Java堆一樣不需要連續(xù)的內(nèi)存和可以選擇固定大小或者可擴(kuò)展外,
還可以選擇不實(shí)現(xiàn)垃圾收集。相對(duì)而言,垃圾收集行為在這個(gè)區(qū)域是比較少出現(xiàn)的,但并非數(shù)據(jù)進(jìn)入了方法區(qū)就如永
久代的名字一樣“永久”存在了。這個(gè)區(qū)域的內(nèi)存回收目標(biāo)主要是針對(duì)常量池的回收和對(duì)類(lèi)型的卸載,一般來(lái)說(shuō)這
個(gè)區(qū)域的回收“成績(jī)”比較難以令人滿(mǎn)意,尤其是類(lèi)型的卸載,條件相當(dāng)苛刻,但是這部分區(qū)域的回收確實(shí)是有必
要的。