每個java程序都是運行在某個具體的java虛擬機實現的實例上,一個java虛擬機負責運行一個java程序,當啓動一個java程序的時候,一個虛擬機就誕生了,當該程序關閉時,這個虛擬機實例也就隨之消亡。java
1 JVM線程c++
當程序中全部的非守護線程(即用戶線程)都結束時,虛擬機實例將自動退出。於是,守護線程不適合作IO操做,由於守護線程是在全部的非守護線程推出後結束,這樣並不能表明守護線程是否完成了相應的操做,若是非守護線程退出後,還有大量的數據沒有寫,將會引起數據丟失問題線程
2 JVM結構對象
-類裝載子系統繼承
每個JVM都有一個類裝載系統,它會跟著給定的全限定名來裝載類型、class文件等內存
每個JVM都有一個執行引擎,他負責執行哪些包含在裝載類中的指令ssl
當JVM運行一個程序的時候,它須要內存來進行存儲不少的東西,好比計算時的中間變量,程序建立的對象,返回值等等,運行時數據區就相似於內存,存存這些東西,每一個運行區包含方法區,堆,JAVA棧,PC寄存器,本地方法棧等
(1)當虛擬機裝載一個class文件時,它會從class文件包含的二進制數據中解析類型信息,而後將這些信息放在方法區中虛擬機
(2)當程序運行的時候,虛擬機就會把全部線程在運行時建立的對象都放在堆中class
(3)若是線程正在執行的是一個JAVA方法,那麼寄存器的值(程序計數器)老是指向下一條將被執行的指令變量
(4)JAVA棧則老是存儲該線程中JAVA方法調用的轉檯--包括它的局部變量、被調用時傳進來的參數、返回值、以及中間結果等等。JAVA棧是由不少的棧幀或這說是幀等組成,一個棧幀包含一個方法調用狀態,當現場調用一個JAVA方法的時候,虛擬機壓入一個方法到該線程的JAVA棧中,當方法返回時,這個棧幀就會從JAVA棧中彈出並拋棄
3 類加載器
JAVA類加載器是JAVA運行時環境的一部分,負責動態的將JAVA類加載到JAVA虛擬機的內存空間中,類一般是按需加載,即第一次使用該類時才加載,類裝載系統除了要定位和導入二進制class文件外,還必須驗證被導入類的數據的正確性,爲變量分配初始化內存,以及幫助解析符號引用等,這些動做按照如下循序執行
(1)裝載-查找並裝載二進制數據
(2)連接-執行驗證、準備等
(3)初始化
4 啓動類裝載器
由原生代碼c++編寫,它負責加載核心JAVA庫
5 用戶自定義類裝載器
繼承classloard類,用戶自定義的類裝載器