深入理解Java虛擬機-JVM高級特性與最佳實踐(第2版)_讀書筆記
第2章 Java內存區域與內存溢出異常
2.1 概述
2.2 運行時數據區域
2.2.2 Java 虛擬機棧
Java 虛擬機棧主要用於存儲方法的執行體;
因爲 Java 虛擬機棧可作爲 GC Roots,而 Java 虛擬機棧中主要用於存儲方法的執行體,所以方法中的所有變量都可作爲 GC Roots;
2.2.4 Java 堆
Java 堆主要用於存放對象實例,被所有線程共享,在虛擬機啓動時創建;
Java 堆是可擴展的,主要通過 -Xms 和 -Xmx 兩個參數控制;
如果堆中沒有足夠內存用於完成對象實例分配,並且堆也無法擴展時,將會拋出 OutOfMemoryError 異常;
Java 堆主要劃分爲新生代和老年代,Java 堆區域劃分示意圖如下:
2.2.5 方法區
方法區中主要用於存儲虛擬機加載的類信息、常量(final 修飾)、靜態變量(static修飾)、即時編譯器編譯後的代碼等數據;
第3章 垃圾收集器與內存分配策略
3.1 概述
3.2 對象已死嗎
3.2.2 可達性分析算法
可作爲 GC Roots 的對象:
- 虛擬機棧中引用的對象——Java 虛擬機棧主要用於存儲方法的執行體,所以方法中的對象都可作爲 GC Roots
- 方法區中類靜態屬性引用的對象
- 方法區中常量引用的對象
- 本地方法棧中 JNI(即一般說的 Native 方法) 引用的對象
3.3 垃圾收集算法
3.3.1 標記-清除算法
3.3.2 複製算法
3.3.3 標記-整理算法
3.3.4 分代收集算法
3.4 HotSpot的算法實現
3.5 垃圾收集器
3.5.1 Serial 收集器
3.5.2 ParNew 收集器
3.5.3 Parallel Scavenge 收集器
- 新生代收集器
- 複製算法
- 並行的多線程收集器
Parallel Scavenge 收集器相關的 JVM 參數
- -XX:MaxGCPauseMills
- -XX:GCTimeRatio
- -XX:+UseAdaptiveSizePolicy