資源描述:
《JVM的內(nèi)存機制介紹.doc》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、本文分為兩個部分:?1,JVMspecifications(JVM規(guī)范) 對JVM內(nèi)存的描述2,Sun的JVM的內(nèi)存機制。?JVM specification對JVM內(nèi)存的描述首先我們來了解JVMspecification中的JVM整體架構(gòu)。如下圖:?????主要包括兩個子系統(tǒng)和兩個組件:Classloader(類裝載器)子系統(tǒng),Executionengine(執(zhí)行引擎) 子系統(tǒng);Runtimedat(yī)aarea (運行時數(shù)據(jù)區(qū)域)組件,?。危幔簦関einterface(本地接口)組件.????Classloader子系統(tǒng)的作用:根據(jù)給定的全限
2、定名類名(如java.lang.Object)來裝載class文件的內(nèi)容到Runtimedata area中的methodarea(方法區(qū)域)。Javsa程序員可以extends java.lang。ClassLoader類來寫自己的Classloader。?????Executionengine子系統(tǒng)的作用 :執(zhí)行classes中的指令。任何JVMspecification實現(xiàn)(JDK)的核心是Execution engine,換句話說:Sun的JDK和IBM的JDK好壞主要取決于他們各自實現(xiàn)的Execution?engine的好壞。每個運
3、行中的線程都有一個Executionengine的實例?!????? Nat(yī)iveinterface組件:與nativelibraries交互,是其它編程語言交互的接口。?????? Runtimedataarea 組件:這個組件就是JVM中的內(nèi)存?!∠旅鎸@個部分進行詳細介紹。Runtime dat(yī)a area的整體架構(gòu)圖本文為互聯(lián)網(wǎng)收集,請勿用作商業(yè)用途Runtimedataarea主要包括五個部分:Heap(堆),Method?。羠ea(方法區(qū)域),Java?。觮ack(java的棧),Program Counter(程序計數(shù)器),?。?/p>
4、ative?。韊thodstack(本地方法棧)。Heap和MethodArea是被所有線程的共享使用的;而Java stack,Programcounter和Nativemethodstack是以線程為粒度的,每個線程獨自擁有。?Heap?。蔭va程序在運行時創(chuàng)建的所有類實或數(shù)組都放在同一個堆中。而一個Java虛擬實例中只存在一個堆空間,因此所有線程都將共享這個堆。每一個java程序獨占一個JVM實例,因而每個java程序都有它自己的堆空間,它們不會彼此干擾。但是同一java程序的多個線程都共享著同一個堆空間,就得考慮多線程訪問對象(堆數(shù)據(jù)
5、)的同步問題。(這里可能出現(xiàn)的異常java.lang.OutOfMemoryError:Javaheapspace)?Methodarea在Java虛擬機中,被裝載的class的信息存儲在Methodarea的內(nèi)存中。當虛擬機裝載某個類型時,它使用類裝載器定位相應的class文件,然后讀入這個class文件內(nèi)容并把它傳輸?shù)教摂M機中.緊接著虛擬機提取其中的類型信息,并將這些信息存儲到方法區(qū).該類型中的類(靜態(tài))變量同樣也存儲在方法區(qū)中。與Heap一樣,method?。醨ea是多線程共享的,因此要考慮多線程訪問的同步問題.比如,假設(shè)同時兩個線程都
6、企圖訪問一個名為Lava的類,而這個類還沒有內(nèi)裝載入虛擬機,那么,這時應該只有一個線程去裝載它,而另一個線程則只能等待。(這里可能出現(xiàn)的異常java.lang.OutOfMemoryError:PermGenfull)?Javastack???????Javastack以幀為單位保存線程的運行狀態(tài).虛擬機只會直接對Java stack執(zhí)行兩種操作:以幀為單位的壓棧或出棧。每當線程調(diào)用一個方法的時候,就對當前狀態(tài)作為一個幀保存到javastack中(壓棧);當一個方法調(diào)用返回時,從javastack彈出一個幀(出棧).棧的大小是有一定的限制,這
7、個可能出現(xiàn)StackOverFlow問題。 下面的程序可以說明這個問題。本文為互聯(lián)網(wǎng)收集,請勿用作商業(yè)用途publicclass TestStackOverFlow?。?publicstat(yī)ic voidmain(String[]args) {?Recursiver=newRecursive();?r.doit(10000);??//Exceptioninthread”main”java.lang.StackOverflowError}}classRecursive{?publicint doit(intt){?if (t<=1) {??re
8、turn1;??}?return t?。玠oit(t — 1);?}}??Programcounter 每個運行中的Java程序,每一個線程都有它自己的PC寄存器,