1、JVM經過執行引擎來完成字節碼的執行,在執行過程當中JVM採用的是本身的一套指令系統,每一個線程在建立後,都會產生一個程序計數器(pc)和棧(Stack)。優化
pc:存放了下一條將要執行的指令;spa
Stack:存放Stack Frame(棧幀),最上面的表示爲當前正在執行的方法。每一個方法的執行都會產生Stack Frame,Stack Frame中存放了傳遞給方法的參數、方法內的局部變量以及操做數棧;線程
局部變量表:存放參數、局部變量;對象
操做數棧:存放指令運算的中間結果;接口
指令負責從操做數棧中彈出參與運算的操做數,指令執行完畢後再將計算結果壓回到操做數棧;內存
當方法執行完畢後則從Stack中彈出,繼續其餘方法的執行。ci
在執行方法時JVM提供了invokestatic、invokevirtual、invokeinterface和invokespecial四種指令來執行get
(1)invokestatic:調用類的static方法it
(2) invokevirtual: 調用對象實例的方法編譯
(3) invokeinterface:將屬性定義爲接口來進行調用
(4) invokespecial: JVM對於初始化對象(Java構造器的方法爲:<init>)以及調用對象實例中的私有方法時。
2、執行技術
主要的執行技術有:解釋,即時編譯,自適應優化、芯片級直接執行
(1)解釋:屬於第一代JVM;
(2)即時編譯:JIT屬於第二代JVM;
(3)自適應優化:(目前Sun的HotspotJVM採用這種技術)則吸收第一代JVM和第二代JVM的經驗,採用二者結合的方式。開始對全部的 代碼都採起解釋執行的方式,並監視代碼執行狀況,而後對那些常常調用的方法啓動一個後臺線程,將其編譯爲本地代碼,並進行仔細優化。若方法再也不頻繁使用, 則取消編譯過的代碼,仍對其進行解釋執行;
(4)芯片級直接執行:內嵌在芯片上,用本地方法執行Java字節碼。
想深刻了解JVM內存分配,請結合 http://hllvm.group.iteye.com/group/wiki/3053-JVM 這篇文章