JVM巨集觀認知 1.什麼是虛擬機? 虛擬機是一種 軟體 。 可分為系統虛擬機(模擬物理機)和程式虛擬機(執行單個電腦程式,比如JVM)。 2.什麼是Java虛擬機(JVM)? JVM是一種將位元組碼轉化為機器碼的軟體。(同上) 歷經時間的迭代,目前廣泛應用的Java虛擬機是Oracle的HotSpo ...
JVM巨集觀認知
1.什麼是虛擬機?
虛擬機是一種軟體。
可分為系統虛擬機(模擬物理機)和程式虛擬機(執行單個電腦程式,比如JVM)。
2.什麼是Java虛擬機(JVM)?
JVM是一種將位元組碼轉化為機器碼的軟體。(同上)
歷經時間的迭代,目前廣泛應用的Java虛擬機是Oracle的HotSpot VM。
3.JVM有什麼用?
- 理論:加深對Java底層運行機制的瞭解和認知
- 實踐:自定義性能更強的JVM(參數調優),排查由於Java應用本身導致的線上問題(調優主要是調堆)
JDK的發佈版本瞭解一下
- 1991.4 :Java語言前身Oak誕生
- 1995.5:Oak語言改名為Java
- 1996.1:JDK1.0發佈,代表技術包括JVM,Applet,AWT
- Applet是一種Java程式,需要嵌入在HTML中解釋執行
- AWT是早期的抽象視窗工具包,目前流行的有Swing,JavaFx
- 1997.2:JDK1.1發佈,代表技術有JAR文件格式,JDBC,內部類,反射
- 2002.2:JDK1.4發佈,新的技術有正則表達式,NIO,日誌類
- 正則表達式是對字元串操作的一種邏輯格式
- NIO在IO的基礎上增加了緩衝區,是一種非阻塞式的IO模型
- 2004.9:JDK1.5發佈,新的技術有自動裝箱,泛型,註解,枚舉,foreach迴圈
- 2006.11:Sun公司宣佈將Java開源,並建立了OpenJDK組織對源碼進行管理。
- 2009.4:Oracle以74億美元收購Sun公司。
- 2014.3:Oracle發佈JDK1.8,新的特性有Lambda表達式,Stream API
- 2017.9:JDK9發佈,新特性有模塊化系統,可交互的REPL工具,JIT,JVMCI等等
- 2018.3:JDK10發佈,新特性包括JEP286局部變數的類型推斷,JEP317向G1引入Full GC
- 2018.9:JDK11發佈,新特性包括基於嵌套的訪問控制,JavaFx被移除【JDK1.8有】
- 2019.3:JDK12發佈,新特性有低暫停時間的GC,微基準測試套件,Switch表達式。
......
JVM記憶體結構
JVM記憶體結構也稱為「運行時數據區」。
線程公有:
- Java堆:存放Java實例對象,生命周期和JVM一致
- 方法區:存儲已被虛擬機載入的類信息、final修飾的常量、static修飾的靜態變數。
- 運行時常量池:是方法區的一部分,存放字面量與符號引用。
- 字面量可以理解為實際值,int a = 8中的8 和 String a = "hello"中的hello都是字面量
- 符號引用是一個字元串,對應唯一的類,方法,或者欄位。
線程私有:
- 程式計數器:每個線程都有一個程式計數器,就是一個指針,指向方法區中的方法位元組碼(下一個將要執行的指令代碼),由執行引擎讀取下一條指令
- 虛擬機棧:描述Java方法執行的過程記憶體是如何變化的。
- 每執行一個方法就會往棧中壓入一個元素,這個元素叫“棧幀”用於存儲局部變數表,棧的出入信息以及方法出口信息等。
- 生命周期和線程相同,線程結束自動釋放記憶體,不需要垃圾回收。
- 本地方法棧:為虛擬機使用到的Native方法服務。Native底層是C語言編寫的,用於和操作系統交互。