jvm虛擬機基本概念

1. JVM 運行時數據區域

1 方法區

保存類信息、常量、靜態變量

2 程序計數器

虛擬機字節碼指令的地址

3 java棧

描述java方法內存模型,包括局部變量、操作數棧、動態鏈接等信息。局部變量包括類型:boolean byte char short int long double float、對象引用、方法返回類型。如果線程請求的棧深度大於虛擬機的棧深度,會報錯StackOverFlow;如果申請內存失敗,會報錯OOM。

4 java堆

特性:
1. 內存最大的區域
2. 所有對象分配的地方
3. 分爲新生代和老生代,垃圾回收的主要區域
4. 可以處理物理上不連續,邏輯上連續
5. 空間不足以分配對象實例會oom

2. 對象分配

步驟:
1. new Object(),檢查常量池中是否聲明瞭類Object,且Object類是否已經加載,如果沒有加載,則開始加載Object類。
2. 進入堆分配內存操作。
3. 線程安全問題,兩種解決方案:1.加上同步鎖;2.ThreadLocal上分配。
3. 虛擬機對象默認的分配內存爲0
4. 初始化對象頭,包括:類型信息、哈希碼、GC年代
5. 初始化實例字段

3. 垃圾收集算法

分代:
1. 標記清除算法。無法解決循環引用的問題,目前虛擬機都沒有采用這個算法。沒有內存碎片問題。
2. 拷貝算法。優點:提升了回收的速度。缺點:內存只能使用一半,拷貝開銷大。
3. 標記壓縮算法。解決了內存碎片問題。

根據對象聲明週期進行分代的架構:

1.新生代:Eden,Survivor。

2.老年代

不同生命週期的對象回收使用不同的回收算法。

大部分對象生命週期都比較短暫,創建以後就會銷燬。存活的對象被臨時放入eden區域,採用拷貝算法進行回收。eden區域被拷貝15次的對象被認爲是長生命週期對象,給放入old分區。這部分對象會隨着時間的增加逐漸增多,採用標記壓縮的回收算法。

4. 類加載機制

4.1 類的加載過程

類加載過程分爲:裝載,驗證、準備、解析,初始化。

類加載的觸發條件:
1. new對象
2. 引用類的靜態變量
3. 引用類的靜態方法
4. 反射調用
5. 初始化一個類,如果父類沒有初始化,首先要初始化父類

被動引用的場景,在此場景下類不會被初始化:

  1. 當訪問一個類的靜態成員變量,只有真正聲明這個變量的類會被初始化。比如該成員變量在父類中聲明,那麼就會初始化父類,不會初始化子類。
  2. 聲明一個類爲類型的數組,不會初始化這個類。比如A[] array = new A[];
  3. 訪問類的常量,不需要初始化類。類的常量是在編譯階段就初始化預存在常量池裏面。

4.2類加載器種類

  1. 引導類加載器:負責加載java的核心庫,c實現
  2. 擴展類加載器:負責加載java的擴展類庫,java實現
  3. 應用類加載器:負責加載應用程序,java實現
  4. 自定義類加載器,java實現
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章