閱讀204 返回首頁    go 阿裏雲 go 技術社區[雲棲]


JVM運行時數據區

JVM定義了若幹個程序執行期間使用的數據區域。這個區域裏的一些數據在JVM啟動的時候創建,在JVM退出的時候銷毀。而其他的數據依賴於每一個線程,在線程創建時創建,在線程退出時銷毀。

2.5.1  程序計數器(The pc Register

JVM一次能支持很多線程執行。每一個JVM線程有它自己的程序計數器。在任何時候,一個JVM的線程都正在執行當前線程的方法代碼。如果這個方法 不是本地方法,程序計數器包含當前被執行的JVM地址。如果線程正在執行本地方法,程序計數器的值為未定義。JVM 程序計數器足以存儲一個返回地址或一 個本地指針。

2.5.2  棧(Java Virtual Machine Stacks

每個JVM的線程在創建的時候,都會創建一個棧。一個棧包含很多棧楨。JVM的棧好比傳統語言C的棧,它維持(存儲)本地變量和部分結果,並在方法 調用和返回中(被)使用。由於JVM棧除了壓入和彈出棧幀之外不能被直接操作,棧幀可以在堆上分配空間。 JVM說明書(規範)允許棧要麼是一個固定大 小,要麼動態擴展來滿足計算的要求。如果JVM棧是一個固定的大小,當棧被創建的時候每一個棧大小可以自由設置。 在動態擴展情況下,可以控製最大最小內 存。 在VM Spec中對這個區域規定了2種異常狀況(以下兩種異常與JVM的棧機製有關):

  • 如果線程請求的棧深度大於虛擬機所允許的深度,將拋出StackOverflowError異常。
  • 如果VM棧可以動態擴展,在初始化新線程時沒有足夠內存創建棧則拋出OutOfMemoryError異常。

2.5.3  堆(Heap

JVM有一個在所有線程內共享的堆。堆是給所有類的實例和數組分配內存的運行時數據區。 堆在虛擬機啟動的時候創建,堆中儲存的對象通過一個自動存 儲管理係統(垃圾回收器)進行回收。 對象從不明確的被分配(JVM從不指明對象的釋放)。JVM加上沒有(JVM不指定特定的自動存儲管理係統)自動存 儲管理係統的特別的類型,(開發者可根據係統要求自主選擇)並且這個存儲管理技術可能被選擇按照實現的係統需求。

堆要麼是固定大小,要麼按計算需要擴展。如果一個大的堆變得多餘或許會收縮。堆的內存不需要相鄰。使用者可以設置堆內存的大小,如果堆能夠動態的擴展。控製最大最小堆內存。

堆會出現以下異常:

  • 如果內存溢出(若計算所需堆內存不足),則拋出OutOfMemoryError

 

2.5.4 方法區(Method Area

JVM的方法區是所有線程共享的,方法區類似於傳統語言編譯代碼時的存儲區域或類似於操作係統進程的文本段。他存儲內容包括:每一個類的結構,如運 行時常量池,字段和方法的數據;方法和構造器的代碼,如用於類,實例和接口初始化的特殊方法。這個方法區在JVM啟動的時候被創建,一般情況下JVM不會 選擇對方法區進行垃圾回收或者壓縮,這個版本的JVM規範沒有強製規定方法區的位置和管理編譯後代碼的策略。方法區可固定大小,或按需伸縮。方法區的內存 不需要相鄰。

2.5.4 運行時常量池(Runtime Constant Pool)

運行時常量池是類和接口運行時的常量池表,它在字節碼文件裏。它包含幾類常量。 在編譯時期識別的數值常量,在運行區識別的方法或引用字段。運行區 常量池類似於傳統語言的字符表,但它比傳統字符表所存儲的範圍更廣。每一個運行區常量池從方法區分配內存。當類和接口被JVM創建時相應的常量池也被創 建。
運行區常量池包括以下異常:

  • 當類和接口創建時,如果運行區常量池所需內存不足,則拋出OutOfMemoryError。

2.5.5 本地方法棧(Native Method Stacks)

JVM一般用傳統棧實現,俗稱“C棧”用來支持本地方法(這些方法不是用java編程語言寫的方法)。本地方法棧還可以被用於翻譯C語言所編寫的 JVM指令集。那些不加載本地方法,不依賴於傳統棧所實現的JVM不需要提供本地方法棧。如果提供本地方法棧,每個線程創建時必須分配一個本地方法棧。 JVM規範規定本地方法棧可固定長度或按需伸縮。 如果JVM棧是一個固定的大小,當棧被創建的時候每一個棧大小可以自由設置。 在動態擴展情況下,可以 控製最大最小內存。

JVM的方法棧有以下兩種異常:

  • 如果線程請求的棧深度大於虛擬機所允許的深度,將拋出StackOverflowError異常。
  • 如果VM棧可以動態擴展,當擴展時無法申請到足夠內存(或者在初始化新線程時沒有足夠內存創建棧)則拋出OutOfMemoryError異常。

文章轉自 並發編程網-ifeve.com

最後更新:2017-05-23 10:32:49

  上一篇:go  Java Fork Join 框架(三)實現
  下一篇:go  剖析Disruptor:為什麼會這麼快?(一)Ringbuffer的特別之處