JVM 目錄
- JVM 體系結構概述
1.1 類的加載機制
1.2 類的加載器有哪幾種
1.3 雙親委派機制
1.4 沙箱安全機制 - 堆 體系結構概述
- 堆 參數調優入門
1.JVM體系結構概覽
2. 類加載器
-
類的加載器一共有三種 BootStrapClassLoader、ExtensionClassLoader、AppClassLoader。加載順序如下
-
BootStrapClassLoader 加載下面路徑下的依賴包
C:\Program Files (x86)\Java\jdk1.8.0_191\jre\lib\rt.jar
- ExtensionClassLoader 加載下面路徑下的依賴包
C:\Program Files (x86)\Java\jdk1.8.0_191\jre\lib\ext
- AppClassLoader
加載用戶自定的類
面試題
: 雙親委派機制 當要加載一個類的是的時候、通常會從上向下區加載、首先查看BootStrapClassLoader、ExtensionClassLoader、AppClassLoader 如果存在的會父類區加載。這樣可以保證對象的唯一。這個唯一性也就是沙箱安全機制。
3. 本地方法棧
- 本地方法棧 負責加載由其他語言編寫的依賴包、例如C語言或者C++語言編寫的業務邏輯。場景在與硬件交互的場景下會使用
4. JAVA棧
-
Java棧 複雜加載程序運行、棧的生命週期與線程同步、算法邏輯爲先進後出。存儲的爲 基本數據類型 + 對象引用變量 + 實例方法等。
-
棧幀 代表的是每執行類中的一個方法都會產生一個棧幀。包括輸入、輸出變量、局部變量。進棧出棧的相關操作。
5. 程序計數器
- 所有線程私有、佔用空間小。記錄的是程序的執行順序。
6. 方法區
- 存儲的是文件的結構信息
7.堆 體系結構概述
知識點 一
堆內 存包括如下三個部分 新生代 、老年代、元空間。三者佔比爲 1 : 2 : 0
備註 jdk1.8 以後 元空間替代永久代 ,並且元空間佔用的是物理內存而不是虛擬機內存, 佔用的物理內存比例爲 0.25 .
知識點 二
在新生代中 伊甸園: 倖存者0 區:倖存者1 區 佔比爲 8 : 1 : 1
知識點 三
在jdk 1.8 當中 堆內存只包括兩部分 新生代 + 老年代 ,默認情況最大內存爲總內存的1/4、初始內存爲1/64
參數含義
1. -- Xms 堆當中初始化內存
2. -- Xmm 堆當中最大內存
3. -- Xmn 新生代佔用內存
在參數調優目標: 減小GC程序的回收次數、提高GC程序的執行效率、因爲GC程序的執行會影響程序的運行效率。
方法1 將堆的初始內存 設置爲 堆的最大內存
知識點 四 垃圾回收機制的執行流程
在新生代 1. 伊甸園區做gc操作將存活的 對象拷貝到 倖存者0區
2. 當倖存者0滿了 以後做GC操作將 對象拷貝到 倖存者1 區
在老年代 3. 當倖存者1區滿了 以後做GC 操作 將存貨的對象拷貝到 老年代區
4. 當老年代 滿了以後 會做 FULL GC 操作
5. Full GC 操作以後發現 由於空間原因 無法將對象進行保存 就會出行 OOM 錯誤,因此發送異常區域在老年代
知識點 五
在老年代執行FULL GC的效率是 小於 在新生代 執行GC 效率的。 原因是因爲老年代空間是新生代的2倍。但是老年代執行的效率卻比新生代慢了大約8-10倍
知識點 六 GC回收算法
在堆當中 對於不同的區域會執行不同的算法, 算法的效率不存在好壞。只有是否適合。
GC回收算法
(1 ) 引用計數發 :對象被引用一次就是會 +1 、引用第二次 +1 +1 。如果不在引用就會 -1 。
缺點 維護計數器本身也會消耗資源 、對於循環引用複雜度高。已經廢棄了
(2) 複製算法 : 作用在新生代、對象在做GC操作的時候對象 對象會被複制。
優點: 對象在內存是連續、不會產生碎片化
缺點: 佔用空間 、因爲被複制兩次
(3) 標記算法 :作用在老年、執行邏輯 第一次標記要清除的對象、第二次清楚對象
優點: 無空間的佔用
缺點: 對象在內存中不是連續的、產生碎片化
(4) 標記壓縮算法 : 作用在老年代 執行邏輯 第一次標記要清除的對象、第二次清楚對象 、第三步壓縮對象
優點: 無碎片化
缺點: 時間複雜度高
關注微信公衆號程序員睿睿
關注後回覆 java虛擬機
獲取 《深入理解Java虛擬機JVM高級特性與最佳實踐》