翻譯人員: 鐵錨
翻譯時間: 2013年11月11日
原文連結: JVM Run-Time Data Areas
參考地址: JVM運行時是什麼樣子。
這是閱讀JVM規範時的筆記, 我畫了一幅圖來協助自己加深理解:
圖1 JVM運行時資料區
1. 單線程資料區(非共用)
從上圖可以看出,每個線程都有自己獨立的資料區,包括 PC(程式計數器),JVM(方法)棧,以及本地方法棧. 當建立新線程時,這些資料區域將會一併建立.
程式計數器: 英文名字是 Program Counter Register,簡稱PC, 用於記錄每個線程執行到哪個地方了(可以認為程式是指令的序列,PC記錄著下一條(或本條)應該執行的指令的地址).
JVM方法棧: 包含如下面的圖所示的一些棧幀(frame).
本地方法棧: 英文為 Native Method Stack,顧名思義,適用於供 native方法使用的記憶體空間,本地方法(native method)指不用Java語言開發的方法,如 C,C++,PB等編譯型語言所開發的動態連結程式庫(中的方法).
2. 所有線程共用資料區
堆記憶體 和 方法區 是所有線程共用的資料區.
堆記憶體: 英文名稱 Heap,是Java編程最頻繁使用的記憶體地區. 其中儲存著 數組和對象,當 JVM啟動時即建立此記憶體地區, 記憶體回收主要是指堆記憶體的回收。
方法區: Method Area,儲存了 運行時常量池,類結構資訊(field and method data) 以及 方法,構造器的代碼.
運行時常量池: Runtime Constant Pool, 每一個類或者介面,在其編譯後產生的 .class檔案中,有一個部分叫做 常量表(constant_pool_table),JVM將class檔案載入以後,就解析常量表的內容到運行時常量池. 包括編譯時間方法中就明確可知的數字值,String值, 以及必須在運行時解析的屬性域引用(field reference).
圖2 JVM棧
JVM棧(Stack)由一個個的 棧幀(Frame)組成,當一個方法被調用時會自動壓入一個棧幀到Stack中. 每個棧幀(frame)由局部變數區,運算元棧,以及對常量(池)的引用組成. 想要瞭解更詳細的資訊,建議訪問: JVM官方文檔.
相關文章:
JVM運行時是什麼樣子。 What does a Java array look like in memory? What can we learn from Java HelloWorld? A simple Swing GUI example for Observer Design Pattern