深入理解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

3.5.4 Serial Old 收集器

3.5.5 Parallel Old 收集器

3.5.6 CMS 收集器

3.5.7 G1 收集器

3.5.8 理解 GC 日誌

3.5.9 垃圾收集器參數總結

3.6 內存分配與回收策略

3.6.1 對象優先在 Eden 分配

3.6.2 大對象直接進入老年代

3.6.3 長期存活的對象將進入老年代

3.6.4 動態對象年齡判定

3.6.5 空間分配擔保

3.7 本章小結

第7章 虛擬機類加載機制

7.1 概述

7.2 類加載的時機

1. 類加載的順序

2. 主動觸發類加載(主動引用)的 5 種場景

3. 被動引用的 3 個代碼示例

7.3 類加載的過程

7.4 類加載器

7.5 本章小結

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