JVM 自學筆記

Eden Space 新生區(heap):內存最初從這個線程池分配給大部分對象。
Survivor Space 倖存區(heap):用於保存在eden space內存池中經過垃圾回收後沒有被回收的對象。對象在Survivor區域中每熬過一次Minor GC 年齡會增加1歲 當達到一定程度會晉升到老年代中。(通過MaxTenuringThreshold設置晉升老年代的年齡閾值)
Tenured Generation 老年代(heap):用於保持已經在survivor space內存池中存在了一段時間的對象。(通過參數可以配置倖存區中堅持幾次沒有收回後放入老年代)
Permanent Generation 永久帶(non-heap):保存虛擬機自己的靜態(reflective)數據,例如類(class)和方法(method)對象,屬於類的(靜態的)屬性和字符串常量等。Java虛擬機共享這些類數據。這個區域被分割爲只讀的和只寫的。
Code Cache 代碼緩存區(non-heap):HotSpot Java虛擬機包括一個用於編譯和保存本地代碼(native code)的內存,叫做“代碼緩存區”(code cache)。
Jvm Stack 虛擬機棧:放着方法參數、局域變量等的引用,方法執行順序按照棧的先入後出方式。

Local Method Statck 本地方法棧:放着本地方法參數、局域變量等的引用,方法執行順序按照棧的先入後出方式。

程序計數器:是一塊較小的內存空間,可以看做當前線程執行的字節碼行號指示器。
通過改變這個計數器的值來選取下一趟需要執行的字節碼指令,分支、循環、跳轉、異常處理、線程恢復等基礎功能實現的依賴。

*各線程的計數器獨立存儲,互不干擾。“線程似有”的內存。

java虛擬機棧:同程序計數器也是線程私有的,生命週期與線程相同。
描述java方法執行的內存模型:每個方法在執行的同時都會創建一個棧幀用於存儲局部變量表、操作數棧、動態鏈接、方法出口等信息。
每個方法從調用直至執行完成的過程,就對應着一個站幀在虛擬機棧中入棧道出棧的過程。
局部變量表存放了編譯期可知的基本數據類型、對象引用(對象起始地址的引用指針)
*其中long和double類型數據佔用2個局部變量空間(slot),其餘數據佔用1個局部變量空間(slot)。
局部變量表所需內存空間在編譯期間完成分配,當進入一個方法時,這個方法需要在幀中分配具體變量空間,在方法執行期間不會改變局部變量表大小。
在java虛擬機規範中對這個區域規定2中異常狀況:
1.如果線程請求的棧深度大於虛擬機所允許的深度,拋出StackOverflowError異常。

2.如果虛擬機棧動態擴展時無法申請到足夠的內存,拋出OutOfMemoryError異常。

本地方法棧:與虛擬機棧所發揮的作用相似,區別在於虛擬機爲虛擬機執行Java方法服務,本地方法棧則爲虛擬機實用到的Native方法服務。

同Java虛擬機棧拋出StackOverflowError和OutOfMemoryError異常。

Java堆:是被所以線程共享的一塊內存區域,在虛擬機啓動時創建,負責分配對象實例。

由於收集器採用分代收集算法,所以Java堆中還可以細分爲:新生代和老年代;

方法區:用於存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據。

與堆區分開的原因和GC分代收集算法有關。(因爲GC是按照分代收集算法由於永久代不需要收回,GC主要負責收回堆中存放的新生代和老年代,但並非絕對,這個區分的弊端是容易遇到內存溢出問題,JDK1.7中已把放在永久帶的字符串常量池移到堆中。)

對象的內存佈局:在HotSpot虛擬機中,對象在內存中存儲的佈局分爲對象頭(Header)、實例數據(Instance Data)和對齊填充(Padding)。
對象頭包含兩部分信息,第一部分用於存儲對象自身的運行時數據(哈希碼),GC分代唸了、鎖狀態標誌。線程持有鎖、偏向線程ID、偏向時間戳等。

另一部分是類型指針,即對象指向它的類元數據的指針。

JVM JDK自帶調試命令

jps(JVM Process Status Tool) 查看正在運行的虛擬機進程
jps -l 輸出主類的全名。如果是jar包顯示jar路徑
jps -v 查看虛擬機進程啓動時的參數
jstat(JVM Statistics Monitoring Tool)監視虛擬機運行狀態信息。
jstat -gc 進程ID (間隔 次數 默認爲查詢一次)監視堆狀態,包括Eden區(年輕帶),兩個Survivor區(倖存帶),老年代,永久帶的容量。已用空間,GC時間合計等信息。
jinfo(Configuration Info for Java)實時查看和調試虛擬機參數。
jinfo pid 查看進程的詳細參數信息。
jmap(Memory Map for Java)命令用於生成堆轉儲快照
jhat(JVM Heap Analysis Tool)虛擬機堆轉儲快照分析工具
jstack(Stack Trace for Java)Java堆棧跟蹤工具


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章