JVM學習筆記(一)之記憶體分割槽
阿新 • • 發佈:2019-02-01
JVM中記憶體區可以根據受訪問許可權的不同定義為執行緒共享和執行緒私有兩大類。以下是我學習的一些筆記,這些知識是基於java7的,java7以後的版本會有點不同,但是大同小異,核心是不會變的。
一、執行緒私有記憶體區
1、PC暫存器(PC計數器)
- 如果執行緒執行的方法是個java方法,那麼pc暫存器就會儲存正在執行的位元組碼指令的地址 ,如果是native方法,這時候pc暫存器就是空(undefined);
- 所謂多執行緒在一個特定的時間內只會執行其中某一個執行緒方法,cpu會不斷作任務切換,所以為每一個執行緒都分配一個pc暫存器 ;
- JVM位元組碼解析器通過改變暫存器的值來明確下一條該執行什麼指令;
- pc暫存器是唯一一個沒有明確規定要丟擲OutofMemeryError的執行時記憶體區。
2、Java棧
- 執行緒私有,生命週期與執行緒的週期保持一致;
- 用於儲存棧幀,棧幀中儲存區域性變量表(各類原始資料型別,物件引用以及returnAddress型別);
- 可被允許實現成固定大小的記憶體或者可動態擴充套件的記憶體大小,如果被設定為固定記憶體,一旦執行緒請求分配的棧容量超過jvm所允許的最大值,則會丟擲StackOverFlowError,反之會丟擲一個OutOfMemoryError。
3、本地方法棧
用於支援本地方法,比如C/C++的執行的區域地址。
二、執行緒私有記憶體區
1、堆區
- 堆區是用於儲存物件例項的記憶體區,是GC執行垃圾回收的重點區域,是執行緒共享的;
- 堆的大小在jvm啟動時就已經設定好,通過-Xmx設定最大記憶體,-Xms設定起始記憶體,一旦超過“Xmx”,丟擲記憶體溢位錯誤;
- 記憶體空間不連續。
2、方法區
- 執行緒共享;
- 儲存每一個java類的結構資訊,如:執行時常量池、欄位和方法資料、建構函式和普通方法的位元組碼內容及類,例項,介面初始化時需要的特殊方法等;
- 包含在java堆內,物理上屬於堆的一部分;
- 記憶體空間不連續;
- 通過“-XX:MaxPermsize”制定最大記憶體,超過則丟擲OOM錯誤。
3、執行時常量池
- 屬於方法區的一部分;
- 當類載入器成功為一個類或介面裝載進jvm後,就會建立與之對應的執行時常量池所需記憶體,如果超過方法區提供的最大值,會丟擲OOM錯誤。
4、效能監控區
- Prims模組的子模組PERF;
- 用於監控jvm內部的perf data計數器,是jvm提供的一塊記憶體共享區,專供外部程式訪問這塊區域的Perf-Data,實現外部程式監控Jvm的效能指標。