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