JVM 综述
概覽
從 JVM 的總體上看,它解決了3個問題:
如下圖所示:
在我們的日常開發中,最和我們息息相關的就是1和2了,比如 GC 調優,內存故障排查,再比如使用自定義的類加載器去實現一些特定的邏輯,就如我們之前分析的 tomcat 源碼中的類加載器用于隔離不同版本的相同類庫,必須要使用自定義的類加載器。
1. Java 程序的內存管理(GC & 運行時數據區)
1.1. 運行時數據區
從上圖中可以看出,虛擬機內存管理主要由幾個部分組成:
1.2. 垃圾回收系統
Java 程序員之所以不需要顯式的釋放內存,一切都歸功于 GC,GC 解放了 Java 程序員的雙手。GC 系統會在后臺清除無用的實例對象,釋放內存空間。
而 JVM 中的 GC 可謂是一個龐大的系統,其中分為幾個部分:
我們將會在后面慢慢講解。
2. Java Class 二進制字節流的加載(ClassLoader)
2.1 類加載器
對于 Java 虛擬機來說,Class 文件是一個重要的接口,無論使用何種語言進行軟件開發,只要能將源文件編譯為正確的 Class 文件,那么這種語言就可以在 Java 虛擬機上運行。可以說,Class 文件就是虛擬機的基石。
如圖所示:
從上圖可以看出,虛擬機不拘泥于 Java 語言,任何一個源文件只要能編譯成 Class 文件的格式,就可以在JVM 上運行!Class 文件格式就像是一個接口,只要遵守這個接口,就能夠在 JVM 上運行。
2.2 類加載器的工作流程
Class 文件通常是以文件的方式存在(任何二進制流都可以是 Class 類型),但只有能被 JVM 加載后才能被使用,才能運行編譯后的代碼。系統裝在 Class 類型可以分為加載,鏈接和初始化三個步驟。其中,鏈接也可分為驗證,準備和解析3步驟。如圖所示:
2.3 類裝載的條件
JVM 不會無故裝載 Class 文件,只有在必要的時候才裝載,哪幾個時候呢?
以上6種情況屬于主動調用,主動調用會觸發初始化,還有一種情況是被動調用,則不會引起初始化。
2.4 類加載器的雙親委派模型
先來看一個著名的圖:
虛擬機為了保護應用程序內出現多個類名相同的類對象,因此發明了這個機制:當 JVM 需要適用一個類時,在判斷類是否已經被加載時,會先從當前底層類加載器進行判斷。當系統需要加載一個類時,會從頂層類開始加載,依次向下嘗試,知道成功,否則拋出ClassNotFound 異常。
# 總結
這篇文章主要是為了后面的詳細文章做一個大綱,因此只是講述以 JVM 的一些基本的框架和概念,后面講詳細的講述內部細節。讓我們學習虛擬機更加的有條理。
轉載于:https://www.cnblogs.com/stateis0/p/9062174.html
總結
- 上一篇: 使用maxwell实时同步mysql数据
- 下一篇: Azure Site Recovery之