1、總的JVM模型:
JVM的功能子產品主要包括類加載器、執行引擎和垃圾回收系統。
java編譯執行過程:源程式(.java檔案)通過java編譯器翻譯成位元組碼(.class)檔案,然後在方法區生成類的資訊,之後通過類轉載器,将class檔案位元組碼内容加載到堆記憶體中,通過位元組碼校驗器和解釋器在堆中生成一個代表這個類的java.lang.class對象,最後執行引擎查找方法入口main(),執行其中的位元組碼指令。
2、虛拟機棧
每一個方法都會開辟一個棧幀
3、程式計數器:
如果正在執行的是 Native 方法,這個計數器的值則為 (Undefined)。此記憶體區域是唯一一個在 Java 虛拟機規範中沒有規定任何 OutOfMemoryError 情況的區域。
4、1.7永久代1.8後的元空間
JDK7 之前(永久代)用于存儲已被虛拟機加載的類資訊、常量、字元串常量、類靜态變量、即時編譯器編譯後的代碼等資料。
jdk1.8後移除了(永久代)取代它的被稱為元空間,
元空間和永久代的差別是:元空間不在虛拟機記憶體,使用的是本地記憶體(直接記憶體)
5、本地方法棧
差別于 Java 虛拟機棧的是,Java 虛拟機棧為虛拟機執行 Java 方法(也就是位元組碼)服務,而本地方法棧則為虛拟機使用到的 Native 方法服務。也會有 StackOverflowError 和 OutOfMemoryError 異常。
6、虛拟機棧
6.1、局部變量表和操作數棧
6.2、動态連結
句柄連結
句柄池實作思路
動态連接配接通過句柄池找到對象執行個體資料指針,對象類型資料指針。
通過執行個體對象資料指針找到執行個體對象資料。
通過對象類型資料指針找到對象類型的資料。
直接連接配接
直接指針實作思路
動态連接配接從java堆的執行個體對象找到對象類型資料指針,
然後根據指針找到方法區對象類型的資料
比較:
使用句柄的最大好處是存儲的是穩定的句柄位址,在對象移動(GC)是隻改變執行個體資料指針位址, 自身不需要修改。
直接指針通路的最大好處是速度快,節省了一次指針定位的時間開銷。
如果是對象頻繁 GC 那麼句柄方法好,如果是對象頻繁通路則直接指針通路好。
6.3、方法出口
7、堆:
對象回收
如何識别回收對像
8、棧中對象的引用:
普通對象
列印new User的引用位址資料
數組對象會多一個length
列印10長的數組,配置設定10個空對象
關于對象頭Mark Word(重)
9、Class的加載方式
雙親委派機制
10、對象的引用
對象的引用分為強引用,軟引用,弱引用,虛引用
(1) 強引用 (Strong Reference)
當記憶體空間不足時,Java虛拟機甯願抛出OutOfMemoryError,也不會随意回收這個對象,如果不使用這個1對象的時候,可以顯式它的引用指派為null,這樣就會被垃圾回收器回收。
(2) 軟引用(Soft Reference)
如果一個對象隻有軟引用,如果記憶體空間足夠,就不會回收它,如果記憶體空間不夠,就會回收這部分記憶體,軟引用可以和一個引用隊列聯合使用,如果軟引用所引用的對象被回收,Java虛拟機就會把這個軟引用加入到與之關聯的引用隊列中。
(3) 弱引用(Weak Reference)
隻要發現隻有弱引用的對象就會立即回收,eg.ThreadLocalMap
(4) 虛引用(Phantom Reference)
虛引用用來跟蹤對象被垃圾回收器回收的活動。虛引用和軟引用與弱引用的差別在于虛引用必須和引用隊列聯合使用,當虛引用被加入到引用隊列的時候,說明這個對象已經被回收,可以在所引用的對象回收之後可以采取必要的行動。
2.3 GC算法
(1)标記清除算法:
分為标記和清除兩個階段,首先先标記所有要回收的對象,在标記完成之後統一回收被标記的對象。缺點是效率低和會産生大量不連續的記憶體碎片
(2)複制算法:
主要用于新生代的回收,把記憶體劃分成大小相等的兩塊,每次隻使用其中的一塊,每次把GC後存活的對象複制到另一塊上,然後清理已經使用過的記憶體。優點是效率高和實作簡單
(3)标記整理算法:
主要用于老年代的回收,先标記需要回收的對象,然後将存活的對象移向一端,然後直接清理掉邊界外的記憶體
分代收集算法
11、GC垃圾回收器
G1
12、JVM調優