JVM 從入門到精通(四)運行時數據區概述及JVM中的線程說明

寫在前面:我是「雲祁」,一枚熱愛技術、會寫詩的大數據開發猿。暱稱來源於王安石詩中一句 [ 雲之祁祁,或雨於淵 ] ,甚是喜歡。


寫博客一方面是對自己學習的一點點總結及記錄,另一方面則是希望能夠幫助更多對大數據感興趣的朋友。如果你也對 數據中臺、數據建模、數據分析以及Flink/Spark/Hadoop/數倉開發 感興趣,可以關注我的動態 https://blog.csdn.net/BeiisBei ,讓我們一起挖掘數據的價值~


每天都要進步一點點,生命不是要超越別人,而是要超越自己! (ง •_•)ง

一、前言

內存是非常重要的系統資源,是硬盤和CPU的中間倉庫及橋樑,承載着操作系統和應用程序的實時運行。JVM內存佈局規定了Java在運行過程中內存申請、分配、管理的策略,保證了JVM的穩定高效運行。不同的JVM對於內存的劃分方式和管理機制存在着部分差異。結合JVM虛擬機規範,來探討一下經典的JVM內存佈局。

在這裏插入圖片描述

二、Java內存空間

在這裏插入圖片描述
JDK8的元數據區+JIT編譯產物 就是JDK8以前的方法區。

JavaAPI中的Runtime

public class Runtime
extends Object

Every Java application has a single instance of class Runtime that allows the application to interface with theenvironment in which the application is running. The current runtime can be obtained from the getRuntime method.

每個Java應用程序都有一個Runtime類的實例,該實例允許該應用程序與運行該應用程序的環境進行交互。 當前運行時可以從getRuntime方法獲得。

三、Java內存分區介紹

Java虛擬機定了了若干種程序運行期間會使用到的運行時數據區,其中有一些會隨着虛擬機啓動而創建,隨着虛擬機退出而銷燬。另外一些則是與線程一一對應的,這些與線程對應的數據區域會隨着線程開始和結束而創建和銷燬。

如圖,灰色的區域爲單獨線程私有的,紅色的爲多個線程共享的,即:

在這裏插入圖片描述

四、Java中的線程與進程

  1. 每個線程:獨立包括 程序計數器、棧、本地棧

  2. 線程間共享:堆、堆外內存(方法區、永久代或元空間、代碼緩存)

在這裏插入圖片描述

  • 線程是一個程序裏的運行單元,JVM允許一個程序有多個線程並行的執行。

  • 在HotSpot JVM,每個線程都與操作系統的本地線程直接映射。
    當一個Java線程準備好執行以後,此時一個操作系統的本地線程也同時創建。java線程執行終止後。本地線程也會回收。

  • 操作系統負責所有線程的安排調度到任何一個可用的CPU上。一旦本地線程初始化成功,它就會調用Java線程中的run()方法。

    4.1 JVM系統線程分類

如果你使用jconsole或者任何一個調試工具,都能看到在後臺有許多線程在運行。這些後臺線程不包括調用main方法的main線程以及所有這個main線程自己創建的線程;

這些主要的後臺系統線程在HotSpot JVM裏主要是以下幾個:

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

  2. 週期任務線程:這種線程是時間週期事件的提現(比如中斷),他們一般用於週期性操作的調度執行。

  3. GC線程:這種線程對於JVM裏不同種類的垃圾收集行爲提供了支持

  4. 編譯線程:這種線程在運行時會降字節碼編譯成本地代碼

  5. 信號調度線程:這種線程接收信號併發送給JVM,在它內部通過調用適當的方法進行處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章