JVM內存模型:
jvm內存模型
- 線程共享
- 方法區:
方法區同堆一樣,是所有線程共享的內存區域,為了區分堆,又被稱為非堆。用于存儲已被虛擬機加載的類信息、常量、靜態變量,如static修飾的變量加載類的時候就被加載到方法區中。運行時常量池是方法區的一部分,class文件除了有類的字段、接口、方法等描述信息之外,還有常量池用于存放編譯期間生成的各種字面量和符號引用。 -
堆:
jvm堆
堆是java虛擬機管理內存最大的一塊內存區域,因為堆存放的對象是線程共享的,所以多線程的時候也需要同步機制。它是所有線程共享的,它的目的是存放對象實例。
1)年輕代收集器
Serial、ParNew、Parallel Scavenge
2)老年代收集器
Serial Old、Parallel Old、CMS收集器
CMS:收集器- 初始標記:標記一下GC Roots能直接關聯到的對象,速度很快
- 并發標記:GC Roots Tarcing過程,即可達性分析
- 重新標記:為了修正因并發標記期間用戶程序運作而產生變動的那一部分對象的標記記錄,會有些許停頓,時間上一般 初始標記 < 重新標記 < 并發標記
- 并發清除
3)特殊收集器
G1收集器[新型,不在年輕、老年代范疇內]
- 方法區:
- 線程私有
- 程序計數器:
為了線程切換可以恢復到正確執行位置,每個線程都需有獨 立的一個程序計數器,不同線程之間的程序計數器互不影響,獨立存儲。 - 本地方法棧:
本地方法棧是與虛擬機棧發揮的作用十分相似,區別是虛擬機棧執行的是Java方法(也就是字節碼)服務,而本地方法棧則為虛擬機使用到的native方法服務,可能底層調用的c或者c++。 -
虛擬機棧
虛擬機棧
每個方法的執行和結束對應著棧幀的入棧和出棧。入棧表示被調用,出棧表示執行完畢或者返回異常。一個虛擬機棧對應一個線程,當前CPU調度的那個線程叫做活動線程;一個棧幀對應一個方法,活動線程的虛擬機棧里最頂部的棧幀代表了當前正在執行的方法,而這個棧幀也被叫做‘當前棧幀’。
- 局部變量表:
是一片邏輯連續的內存空間,最小單位是Slot,用來存放方法參數和方法內部定義的局部變量。 - 操作數棧:
1).棧楨剛創建時,里面的操作數棧是空的。
2).Java虛擬機提供指令來讓操作數棧對一些數據進行入棧操作,比如可以把局部變量表里的數據、實例的字段等數據入棧。
3).同時也有指令來支持出棧操作。
4).向其他方法傳參的參數,也存在操作數棧中。
5).其他方法返回的結果,返回時存在操作數棧中。 - 動態鏈接:
一個方法調用另一個方法,或者一個類使用另一個類的成員變量時,
符號引用和直接引用在運行時進行解析和鏈接的過程,叫動態鏈接。
每一個棧幀內部都要包含一個指向運行時常量池的引用,來支持動態鏈接的實現。 - 方法返回地址:
返回一個值給調用它的方法。當前棧楨就被用來恢復調用者的狀態,都恢復哪些呢?恢復局部變量表、操作數棧 和 程序計數器(pc指針),而這個程序計數器要適當地增加,來指向下一條指令(也就是調用函數的下一句)。使調用者方法能夠正常地繼續執行下去,而且返回值push到了調用方法的操作數棧中。
- 局部變量表:
- 程序計數器:
最后總結一下:
jvm總結
參考:
深入理解JVM-內存模型(jmm)和GC
JVM內存堆布局圖解分析