03-运行时数据区概述及线程
運行時數據區概述及線程
前言
本節主要講的是運行時數據區,也就是下圖這部分,它是在類加載完成后的階段
當我們通過前面的:類的加載-> 驗證 -> 準備 -> 解析 -> 初始化 這幾個階段完成后,就會用到執行引擎對我們的類進行使用,同時執行引擎將會使用到我們的運行時數據區
也就是大廚做飯,我們把大廚后面的東西(切好的菜,刀,調料),比作是運行時數據區。而廚師可以類比于執行引擎,將通過準備的東西進行制作成精美的菜品
內存是非常重要的系統資源,是硬盤和CPU的中間倉庫及橋梁,承載著操作系統和應用程序的實時運行JVM內存布局規定了Java在運行過程中內存申請、分配、管理的策略,保證了JVM的高效穩定運行。不同的JVM對于內存的劃分方式和管理機制存在著部分差異。結合JVM虛擬機規范,來探討一下經典的JVM內存布局。
我們通過磁盤或者網絡IO得到的數據,都需要先加載到內存中,然后CPU從內存中獲取數據進行讀取,也就是說內存充當了CPU和磁盤之間的橋梁
運行時數據區的完整圖
Java虛擬機定義了若干種程序運行期間會使用到的運行時數據區,其中有一些會隨著虛擬機啟動而創建,隨著虛擬機退出而銷毀。另外一些則是與線程一一對應的,這些與線程對應的數據區域會隨著線程開始和結束而創建和銷毀。
灰色的為單獨線程私有的,紅色的為多個線程共享的。即:
- 每個線程:獨立包括程序計數器、棧、本地棧。
- 線程間共享:堆、堆外內存(永久代或元空間、代碼緩存)(即方法區)
其中,我們主要考慮的垃圾回收問題在于堆空間(占絕大部分)和方法區。在JDK8以后,方法區換為元空間,使用本地內存,本地內存雖然大,但也可能存在溢出問題,因此也會考慮回收問題。
關于線程間共享的說明
線程
-
線程是一個程序里的運行單元。JVM允許一個應用有多個線程并行的執行。
-
在Hotspot JVM里,每個線程都與操作系統的本地線程直接映射。
- 當一個Java線程準備好執行以后,此時一個操作系統的本地線程也同時創建。Java線程執行終止后,本地線程也會回收。
-
操作系統負責所有線程的安排調度到任何一個可用的CPU上。一旦本地線程初始化成功,它就會調用Java線程中的run()方法。當run()方法執行出現異常,Java線程必然終止,此外,cpu還需考慮是否終止JVM虛擬機,若上述終止的是最后一個非守護線程,那么此時,虛擬機就可以退出了。
- 線程分為守護線程和普通線程,當程序中只剩下守護線程時,虛擬機就可以退出了。
JVM系統線程
如果你使用jconsole或者是任何一個調試工具,都能看到在后臺有許多線程在運行。這些后臺線程不包括調用public static void main(String[])的main線程以及所有這個main線程自己創建的線程。|
這些主要的后臺系統線程在Hotspot JVM里主要是以下幾個:
- 虛擬機線程:這種線程的操作是需要JVM達到安全點才會出現。這些操作必須在不同的線程中發生的原因是他們都需要JVM達到安全點,這樣堆才不會變化。這種線程的執行類型包括"stop-the-world"的垃圾收集,線程棧收集,線程掛起以及偏向鎖撤銷。
- 周期任務線程:這種線程是時間周期事件的體現(比如中斷),他們一般用于周期性操作的調度執行。
- GC線程:這種線程對在JVM里不同種類的垃圾收集行為提供了支持。
- 編譯線程:這種線程在運行時會將字節碼編譯成到本地代碼。
- 信號調度線程:這種線程接收信號并發送給JVM,在它內部通過調用適當的方法進行處理。
總結
以上是生活随笔為你收集整理的03-运行时数据区概述及线程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 01-JVM与Java体系结构
- 下一篇: 04-程序计数器(PC计数器)