jvm執行時資料區及執行緒

語言: CN / TW / HK

我正在參加「掘金·啟航計劃」

執行時資料區(Runtime Data Area):

calss檔案通過類載入器載入(load、link、initialize)到記憶體當中,這個記憶體就是屬於執行時資料區,當然不只是class,執行時資料區主要包括:元空間(Metaspace)、程式計數器(Program counter Register)、本地方法棧(Native Method Stack)、虛擬機器棧(JVM Stack)、堆(Heap)。如下圖:

image.png

執行時資料區與記憶體

  1. 記憶體是非常重要的系統資源,是硬碟和CPU的中間倉庫及橋樑,承載著作業系統和應用程式的實時執行。JVM記憶體佈局規定了Java在執行過程中記憶體申請、分配、管理的策略,保證了JVM的高效穩定執行。不同的JVM對於記憶體的劃分方式和管理機制存在著部分差異。結合JVM虛擬機器規範,來探討一下經典的JVM記憶體佈局。
  2. 我們通過磁碟或者網路IO得到的資料,都需要先載入到記憶體中,然後CPU從記憶體中獲取資料進行讀取,也就是說記憶體充當了CPU和磁碟之間的橋樑

下圖為阿里jdk1.8的執行時資料區劃分圖:

image.png

執行緒的記憶體空間

  1. Java虛擬機器定義了若干種程式執行期間會使用到的執行時資料區:其中有一些會隨著虛擬機器啟動而建立,隨著虛擬機器退出而銷燬。另外一些則是與執行緒一一對應的,這些與執行緒對應的資料區域會隨著執行緒開始和結束而建立和銷燬。

  2. 灰色的為單獨執行緒私有的,紅色的為多個執行緒共享的。即:

    • 執行緒獨有:獨立包括程式計數器、棧、本地方法棧
    • 執行緒間共享:堆、堆外記憶體(永久代或元空間、程式碼快取)

如下圖:

image.png

Runtime類

每個JVM只有一個Runtime例項。即為執行時環境,相當於記憶體結構的中間的那個框框:執行時環境。

image.png

執行緒

JVM 執行緒

  1. 執行緒是一個程式裡的執行單元。JVM允許一個應用有多個執行緒並行的執行

  2. 在Hotspot JVM裡,每個執行緒都與作業系統的本地執行緒直接對映

    • 當一個Java執行緒準備好執行以後,此時一個作業系統的本地執行緒也同時建立。Java執行緒執行終止後,本地執行緒也會回收
  3. 作業系統負責將執行緒安排排程到任何一個可用的CPU上。一旦本地執行緒初始化成功,它就會呼叫Java執行緒中的run()方法

JVM 系統執行緒

  • 如果你使用jconsole或者是任何一個除錯工具,都能看到在後臺有許多執行緒在執行。這些後臺執行緒不包括呼叫public static void main(String[])的main執行緒以及所有這個main執行緒自己建立的執行緒。
  • 這些主要的後臺系統執行緒在Hotspot JVM裡主要是以下幾個:

  • 虛擬機器執行緒:這種執行緒的操作是需要JVM達到安全點才會出現。這些操作必須在不同的執行緒中發生的原因是他們都需要JVM達到安全點,這樣堆才不會變化。這種執行緒的執行型別括”stop-the-world”的垃圾收集,執行緒棧收集,執行緒掛起以及偏向鎖撤銷

  • 週期任務執行緒:這種執行緒是時間週期事件的體現(比如中斷),他們一般用於週期性操作的排程執行
  • GC執行緒:這種執行緒對在JVM裡不同種類的垃圾收集行為提供了支援
  • 編譯執行緒:這種執行緒在執行時會將位元組碼編譯成到原生代碼
  • 訊號排程執行緒:這種執行緒接收訊號併發送給JVM,在它內部通過呼叫適當的方法進行處理