内存模型
jvm內存區域
運行時數據區域
- 程序計數器
- Java虛擬機棧
- 本地方法棧
- Java堆
- 方法區
- 運行時常量池
程序計數器
- 程序計數器是屬于線程私有的
- 記錄了當前線程切換前程序所處于的位置,方便線程切換回來后,能恢復的正確的執行位置
- 如果運行的是Java方法,則記錄的是虛擬機字節碼指令的地址,如果是本地方法,這個計數器為空
Java虛擬機棧
- java虛擬機棧也是線程私有的
- 在每個方法運行時都會創建一個棧幀,記錄局部變量表,操作數棧,動態鏈接等信息
- 當進入一個方法時,這個方法需要在幀中分配多大的局部變量空間是完全確定的,方法運行期間是不會改變局部變量表的
局部變量表
- 存放了編譯器可知的基本數據類型,對象引用,returnAddress類型
本地方法棧
- 與虛擬機棧相似,只不過為本地方法服務
Java堆
- Java堆是線程公有的
- 此內存區域的唯一目的就是存放對象實例,幾乎所有的實例都在堆中分配。
- 有一部分內存實在棧上分配的(通過逃逸分析)
- java堆是垃圾回收管理的主要區域
逃逸分析
- 方法逃逸
當一個對象在方法中定義之后,作為參數傳遞到其它方法中
- 線程逃逸
如類變量或實例變量,可能被其它線程訪問到
優化
如果不存在逃逸行為,則可以對該對象進行如下優化
- 同步消除
線程同步本身比較耗時,如果逃逸分析確定不會掏出線程,則消除同步,開啟同步消除需要先開啟逃逸分析典型例子stringBuffer.append("");
- 標量替換
- 棧上分配
在棧上分配對象
方法區
- 是線程共享區域
- 通常加載類信息,常量,靜態變量,即時編譯后的代碼等
- 這里需要知道永久代與方法區不對等,只是Hotspot使用永久代來實現方法區,其他虛擬機并不是
運行時常量池
- 是方法區的一部分
- 常量池(用于存放編譯器生產的各種字面量和符號引用)
總結
- 上一篇: .net core项目实战之开发环境搭建
- 下一篇: Django - app