JVM+GC(1)
JVM內存結構
- 方法區:
- 存儲運行時常量池,虛擬機所加載的類信息(版本字段方法接口),常量,靜態變量,編譯後代碼
- innern()可以將堆中new的實例的常量放在常量池
- 方法區
- 垃圾回收在方法區的行爲
- 異常定義
- 堆:
存儲對象的實例
垃圾回收的主要區域
- 程序計數器:
比較小的內存空間
處於線程獨佔區
如果線程執行的是Java方法,計數器記錄的是字節碼指令地址
沒有內存溢出的情況
GOTo切換到某一行,保留字
- 虛擬機棧:
存放方法運行時數據,存的棧幀
每個方法執行都會創建一個棧幀,存儲局部變量表(存放各種基本數據類型,引用類型,returnaddress類型。內存空間在編譯期完成分配,當進入一個方法是,這個方法分配多少內存是固定的,方法運行期間不會改變局部變量大小),操作數棧,動態鏈接,方法出口
棧的大小
爲虛擬機執行Java方法服務
- 本地方法棧:
爲虛擬機執行native方法服務
- 直接內存:
jdk1.4彌補IO 的一宗NIO ,分配堆外內存
- 棧上分配:
根據逃逸分析,分析對象作用域
JVM垃圾回收
-
什麼是垃圾:內存中不再使用的對象
-
如何判斷對象是否應該被回收?
-
引用計數法(一般不採用)
-
可達性分析法(一定要從GCRoot開始)
- 可以作爲GCroot的對象
- 虛擬機棧中的
- 方法去中的靜態屬性引用的對象
- 方法區中常量引用的對象
- 本地方法棧中JNI引用的對象
JVM 垃圾回收算法