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