讀書筆記之JVM內存區域

 

Java虛擬機在執行Java程序的過程中會把它所管理的內存劃分爲以下若干個不同的數據區域,本文就是簡單說明下這些區域的作用,服務對象以及其中可能產生的問題

1、程序計數器:當前線程所執行的字節碼的行號指示器,字節碼解釋器通過改變這個計數器的值來選取下一條需要執行的字節碼指令。Java虛擬機是通過線程輪流切換並分配處理器的執行時間來實現多線程的,對於某個確定的時刻來說,一個處理器都只會執行一個線程中的指令,所以對於線程切換來說(爲了保護線程的執行現場),每個線程都有自己獨立的程序計數器,且各個線程的程序計數器互不影響,獨立存儲,又把這類內存區域稱爲“線程私有”的內存。如果線程正在執行的是一個Java方法,程序計數器記錄的是正在執行的虛擬機字節碼指令的地址,若執行的是Native方法(String.intern()就是Native方法,何爲Native方法,這篇文章有詳細說明點擊打開鏈接),程序計數器的值則爲空。程序計數器所佔的內存區域是java虛擬機規範中沒有規定任何有OutOfMemoryError的區域

 

     2、Java虛擬機棧:Java虛擬機棧也是線程私有的,生命週期同線程相同。虛擬機棧描述的的Java方法執行的內存模型:每個方法執行時會創建一個棧幀(stack Frame),用戶存儲局部變量表,操作數棧,動態鏈接,方法出口等信息。每一個方法從調用直到執行完畢的過程,對應着一個棧幀在虛擬機棧中入棧到出棧的過程。如果線程請求的棧深度超過虛擬機所允許的深度,就會拋出StackOverFlowError異常;如果虛擬機棧可以動態擴展(當前大部分Java虛擬機都可動態擴展),如果擴展時無法申請得到足夠的內存,就會拋出OutOfMemoryError異常。

 

 

  3、本地方法棧:同Java虛擬機棧發揮的作用非常相似,區別則是Java虛擬機棧爲虛擬機執行Java方法(字節碼)服務,而本地方法棧則爲虛擬機使用的Native方法服務。同Java虛擬機棧一樣,本地方法棧也會拋出StackOverFlowError和OutOfMemoryError 異常。

 

 

 4、Java堆(Heap):對大多數應用來說,Java Heap是Java虛擬機所管理的內存中最大的一塊,Java Heap是被所有線程共享的一塊內存區域,虛擬機啓動時創建,此內存區域的唯一目的就是存放實例對象,幾乎所有的實例對象和數組都要在堆上分配。(原書是介紹說隨着JIT編譯器發展和逃逸分析技術的逐漸成熟,棧上分配,標量替換優化技術將會導致一些微妙的變化,所有的對象都分配在堆上變得不是那麼絕對)(這個不瞭解)。

Java Heap是垃圾回收器管理的主要區域,所有又被稱爲GC堆(Garbage collected Heap),Java Heap可以處在物理上不連續的內存空間,但是邏輯上得是連續的。如果在堆中沒有內存完成實例分配,並且堆也無法擴展時,就會拋出OutOfMemoryError異常。

 

 

 5、方法區(Method Area):同Java Heap也是各個線程共享的內存區域,用於存儲已被虛擬機加載的類信息,常量,靜態變量,即時編譯器編譯後的代碼等數據,雖然Java虛擬機規範吧方法區描述爲堆的一個邏輯部分,但它的別名Non-Heap(非堆),可見一斑,目的就是爲了與Java Heap區分開。(又稱“永久代”,本質上兩者並不等價,僅僅是因爲HotSpot虛擬機的設計團隊使用永久代替代了方法區)。當方法區無法滿足內存分配需求時,就會拋出OutOfMemoryError異常。

 

 

6、運行時常量池(Runtime Constant Pool):也是方法區的一部分,class文件中出了有關類的字段,方法等描述信息外,還有一項是常量池(Constant Pool Table),常量池用與存放編譯器生成各種字面量和符號引用,這部分內容將在類加載後進入方法區的運行時常量池中存放。不過運行時常量池相對於Class文件常量池,有另一個重要特徵就是具備動態性,Java語言並不要求常量一定只有編譯期才能產生(意思是:並非預置入Class文件中常量池的內容才能進入運行時常量池),運行期間也能將新的常量放入池中,這個特性最廣泛的應用就是String類的intern()方法。

 

 

7、直接內存(Direct Memory):Direct Memory並不是虛擬機運行時數據區的一部分,也不是Java虛擬機規範中定義的內存區域,所以不受Java堆大小的限制,但是會受限於本機總內存的限制,所以也會導致OutOfMemoryError異常出現,最典型的應用就是java1.4中新加入的NIO(new Input/Output)類。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章