JVM基本結構詳解

什麼是Java虛擬機

此處涉及到兩個概念:java

  • Java虛擬機,至關於咱們定義的Java類
  • Java虛擬機實例,至關於new一個Java類

注意:Java虛擬機經過java.exe或javaw.exe來啓動一個Java虛擬機實例網絡

JVM生命週期

Java虛擬機中存在兩種線程:函數

  • 守護線程,例GC線程
  • 非守護線程,例main函數、自定義的線程

注:java虛擬機中,只要有任何非守護線程還沒結束,java虛擬機的實例都不會退出。操作系統

java虛擬機的生命週期: 當一個java應用程序main函數啓動時虛擬機也同時被啓動,而只有當在虛擬機實例中的全部非守護進程都結束時,java虛擬機實例才結束生命。線程

JVM體系結構

輸入圖片說明

輸入圖片說明

  1. 類加載器(ClassLoader)

當一個ClassLoader啓動時,ClassLoader的生存地點在JVM堆中,而後它會從文件系統或網絡上將.class文件裝載到JVM的方法區(永久區),方法區中的這個字節文件會被虛擬機拿來new一個對象實例,而後在JVM堆內生成一個字節碼的對象,而且在class字節碼的內存文件中有兩個引用:一個指向堆中class對象實例,一個指向加載本身的ClassLoader對象

2.執行引擎接口

執行引擎是java虛擬機的最核心組件之一,它負責執行虛擬機的字節碼,現代虛擬機爲了提升執行效率,會使用即時編譯技術將方法編譯成機器碼後再執行生命週期

  1. 方法區(永久區)

方法區,存放被類加載器裝載的類信息,包括類信息(修飾符、類名等)、字段屬性(修飾符、類型、字段名等)、方法信息(修飾符、回參、方法名、入參等)、類變量(就是static修飾的靜態字段)等等。除了類信息外,方法區中還存放運行時的常量池信息,包括字符串字面量和數字常量進程

  1. Java堆

java堆在虛擬機啓動時建立,是java程序最主要的內存工做區域。幾乎全部的java對象實例都存放在java堆中。堆空間是全部線程共享的。圖片

  1. Java虛擬機棧

每個java線程都有一個私有的java虛擬機棧,它在線程建立的時候被建立,java棧中保存着棧幀信息,一個方法對應一個棧幀(包括方法的局部變量、方法參數等)

  1. 本地方法棧

本地方法棧,和java棧很是相似,最大的不一樣在於java棧用於java方法的調用,而本地方法棧則用於本地方法的調用。

總結

當一個程序啓動前,它的class文件會被類加載器(ClassLoader)裝入方法區(永久區)執行引擎讀取方法區的字節碼進行解析,邊解析邊運行,而後PC寄存器指向了main函數所在位置,虛擬機開始爲main函數在Java虛擬機棧中預留一個棧幀,而後開始執行main函數,main函數裏的代碼被執行引擎映射成本地操做系統裏相應的實現,而後調用本地方法接口,本地方法運行時操做系統會爲本地方法分配本地方法棧,用來存儲一些臨時變量,而後運行本地方法,調用操做系統API等等。

相關文章
相關標籤/搜索