JVM:java
Java虛擬機是一臺抽象的計算機,其規範定義了每一個java虛擬機都必須實現的特性,同時爲每一個實現都留下了不少選擇,好比它同時容許虛擬機使用純軟件的方式實現執行Java字節碼或很大部分又硬件實現,這一特性保證了JVM的跨平臺性。Java文件編譯順序以下c++
Java虛擬機的主要任務是裝載class文件並執行其中的字節碼,Java虛擬機包含一個類裝載器(class loader),它能夠從程序和API中裝載class文件。Java API只有在被使用的時候纔會被裝載。字節碼由執行引擎來執行。執行引擎在不一樣的JVM中有不一樣的實現,最簡單的是一次性解釋字節碼,另外一種更快可是更加消耗內存的引擎叫作即時編譯器,這種編譯器在第一次被執行的字節碼編譯成本機代碼的時候進行緩存。第三種引擎是自適應優化器,它會監視運行中程序的運動並記錄下活動最頻繁的代碼編譯成本機代碼進行緩存。數組
Java程序經過調用本地方法與主機進行交互。Java中有兩種方法Java方法和本地方法。Java由Java編寫,編譯成字節碼儲存在class文件中。本地方法又其餘語言(c,c++,彙編等)實現,編譯成與處理器相關的機器代碼,保存在動態庫中。Java方法是與平臺無關的,但本地方法不是,本地方法是鏈接Java程序和底層主機操做系統的鏈接方式。緩存
JVM的生命週期 架構
每一個Java程序都跑在本身的Java虛擬機實例中,虛擬機的啓動和退出和虛擬機保持一致。
函數
Java虛擬機經過調用某個類的main函數來運行一個Java程序。Java虛擬機內有兩種線程守護線程和非守護線程,守護線程一般是虛擬機本身使用的如內存垃圾收集任務,Java程序也能夠把它建立的任何線程給標記爲守護線程,而main函數所在線程是非守護線程。當該程序的全部非守護進程都退出時,虛擬機實例也將自動退出,固然程序自己也能調用方法退出。優化
JVM的體系結構 spa
當Java虛擬機運行一個程序時,它須要內存來存儲許多東西,如:字節碼、從已裝載的class文件中獲得的其餘信息、程序建立的對象、傳遞給方法的參數、返回值、局部變量及運算的中間結果等,JVM把這些東西都組織到了幾個「運行時數據區中」進行管理。
操作系統
當虛擬機裝載一個class文件時,虛擬機會從這個class文件中解析出類型信息並放入方法區中,當程序運行時會將全部建立的對象放入堆中。線程
當一個新線程被建立後,它將獲得本身的PC寄存器(程序計數器)及Java棧,若是當前線程正在執行一個Java方法,PC寄存器的值將老是指向下一條將被執行的指令,Java棧將會儲存該線程中Java方法調用的狀態(包括它的局部變量,入參,返回值等)。
Java棧是又許多棧幀組成的,一個棧幀包含一個Java方法調用的狀態。當調用一個Java方法時,虛擬機壓入一個Java棧幀到棧中,方法退出時,相應的棧幀被彈出。任何線程不能訪問另外一個線程的棧和PC寄存器。
Java虛擬機沒有寄存器,其指令集使用Java棧來存儲。這樣設計的緣由是爲了保持Java虛擬機的指令集儘可能緊湊以及能在那些只有不多寄存器的平臺上實現。
堆 :
Java程序在運行時建立的全部類實例或數組都放在同一個堆裏,一個Java虛擬機實例只存在一個堆空間,可是同一個程序的多個線程共享着一個堆空間,在這種狀況下就必需要考慮堆數據的同步問題了。
JDK/JRE:
咱們能夠把Java程序設計語言、Java虛擬機以及JavaAPI庫這三部分統稱爲JDK(Java Development Kit),JDK是用於支持Java開發的最小環境。
JRE(Java Runtime Environment) 顧名思義 就是Java運行環境的意思 它包括了Java虛擬機和Java SE API子集兩部分,是用於支持Java程序運行的標準環境。
JAVA SE/JAVA EE
Java SE(Java Standard Edition) 支持面向桌面級應用的Java平臺,提供了完整的Java SE API(java.*),舊稱爲J2SE。
Java EE(Java Enterprise Edition) 支持使用多層架構企業應用的java平臺,除提供了Java SE API外,還提供了大量的擴充(javax.*)並提供了相關的部署支持,舊稱J2EE。