【JVM之記憶體與垃圾回收篇】運行時數據區概述及執行緒
運行時數據區概述及執行緒
前言
本節主要講的是運行時數據區,也就是下圖這部分,它是在類載入完成後的階段
當我們通過前面的:類的載入-> 驗證 -> 準備 -> 解析 -> 初始化 這幾個階段完成後,就會用到執行引擎對我們的類進行使用,同時執行引擎將會使用到我們運行時數據區
也就是大廚做飯,我們把大廚後面的東西(切好的菜,刀,調料),比作是運行時數據區。而廚師可以類比於執行引擎,將通過準備的東西進行製作成精美的菜品
記憶體是非常重要的系統資源,是硬碟和 CPU 的中間倉庫及橋樑,承載著作業系統和應用程式的實時運行 JVM 記憶體布局規定了 Java 在運行過程中記憶體申請、分配、管理的策略,保證了 JVM 的高效穩定運行。不同的 JVM 對於記憶體的劃分方式和管理機制存在著部分差異。結合 JVM 虛擬機規範,來探討一下經典的 JVM 記憶體布局。
我們通過磁碟或者網路 IO 得到的數據,都需要先載入到記憶體中,然後 CPU 從記憶體中獲取數據進行讀取,也就是說記憶體充當了 CPU 和磁碟之間的橋樑
運行時數據區的完整圖
Java 虛擬機定義了若干種程式運行期間會使用到的運行時數據區,其中有一些會隨著虛擬機啟動而創建,隨著虛擬機退出而銷毀。另外一些則是與執行緒一一對應的,這些與執行緒對應的數據區域會隨著執行緒開始和結束而創建和銷毀。
灰色的為單獨執行緒私有的,紅色的為多個執行緒共享的。即:
- 每個執行緒:獨立包括程式計數器、棧、本地棧。
- 執行緒間共享:堆、堆外記憶體(永久代或元空間、程式碼快取)
執行緒
執行緒是一個程式里的運行單元。JVM 允許一個應用有多個執行緒並行的執行。
在 Hotspot JVM 里,每個執行緒都與作業系統的本地執行緒直接映射。
- 當一個 Java 執行緒準備好執行以後,此時一個作業系統的本地執行緒也同時創建。Java 執行緒執行終止後,本地執行緒也會回收。
作業系統負責所有執行緒的安排調度到任何一個可用的 CPU 上。一旦本地執行緒初始化成功,它就會調用 Java 執行緒中的 run()
方法。
JVM 系統執行緒
如果你使用 jconsole 或者是任何一個調試工具,都能看到在後台有許多執行緒在運行。這些後台執行緒不包括調用 public static void main(String[])
的 main 執行緒以及所有這個 main 執行緒自己創建的執行緒。
這些主要的後台系統執行緒在 Hotspot JVM 里主要是以下幾個:
- 虛擬機執行緒:這種執行緒的操作是需要 JVM 達到安全點才會出現。這些操作必須在不同的執行緒中發生的原因是他們都需要 JVM 達到安全點,這樣堆才不會變化。這種執行緒的執行類型包括「stop-the-world」的垃圾收集,執行緒棧收集,執行緒掛起以及偏向鎖撤銷。
- 周期任務執行緒:這種執行緒是時間周期事件的體現(比如中斷),他們一般用於周期性操作的調度執行。
- GC 執行緒:這種執行緒對在 JVM 里不同種類的垃圾收集行為提供了支援。
- 編譯執行緒:這種執行緒在運行時會將位元組碼編譯成到本地程式碼。
- 訊號調度執行緒:這種執行緒接收訊號並發送給 JVM,在它內部通過調用適當的方法進行處理。