新聞中心
JVM有很多值得學習的地方,這里就和大家一起來看一下它都包含哪些機制,常用的有Java源碼編譯機制,類加載機制和類執(zhí)行機制幾種,這里詳細介紹一下。

岳麓ssl適用于網站、小程序/APP、API接口等需要進行數據傳輸應用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!
JVM學習筆記之JVM機制
一、JVM學習筆記之Java源碼編譯機制:
1。分析和輸入到符號表(ParserAndEnter):
詞法分析com.sun.tools.javac.parser.Scanner:將代碼字符串轉變?yōu)閠oken序列。
語法分析com.sun.tools.javac.parser.Parser:Token序列生成抽象語法樹。
輸入到符號表com.sun.tools.javac.comp.Enter:類中出現的符號輸入類自身的符號表中等。
2。注釋處理(AnnotationProcessing)
用于處理用戶自定義的annotation,處理后再次進入ParserAndEnter步驟。
3。語法分析和生成class文件(AnalyseandGenerate)
基于抽象語法樹進行一序列語義分析,再完成分析后,開始生成class文件com.sun.tools.javac.jvm.Gen。
二、JVM學習筆記之類加載機制(類加載器子系統(tǒng)的工作職責與工作流程):
1。裝載(Load):查找并裝載二進制字節(jié)碼,采用兩個元素來標識一個被加載的類:類的全限定名+ClassLoader實例ID。
2。鏈接(Link):校驗(Verify)--格式校驗確保被導入類的正確性-->準備(Prepared)--為類變量分配內存空間并初始化默認值-->解析(Resolve)--把導入類的符號引用轉換為直接引用。
3。初始化(Initialize):執(zhí)行類中的靜態(tài)初始化代碼、構造器代碼及靜態(tài)屬性的初始化。
ClassLoader雙親委派模型:
BootstrapClassLoader--$JAVA_HOME/jre/lib/rt.jar(曾祖父)<--
ExtensionClassLoader--$JAVA_HOME/jre/lib/ext/*.jar(祖父)<--
SystemClassLoader--$CLASSPATH(父親)<--
User-DefinedClassLoader
三、JVM學習筆記之類執(zhí)行機制:
SunJDK基于棧的體系結構來執(zhí)行字節(jié)碼,代碼緊湊,體積小。調用方法invokestatic、invokespecial、invokevirtual、invokeinterface。
1。字節(jié)碼解釋執(zhí)行
指令解釋執(zhí)行:對于方法的指令解釋執(zhí)行,執(zhí)行方式為經典馮*諾依曼體系的FDX循環(huán)方式,有switching-threading、token-threading、direct-threading、subroutine-threading、inline-threading。
SunJDK主要的優(yōu)化:
棧頂緩存(top-of-stackcaching):即將本來位于操作棧頂的值直接緩存到寄存器上,這對于大部分只需要一個值的操作而言,無須將數據放入操作數棧,可直接在寄存器計算,然后返回操作數棧。
部分棧幀共享:當方法調用時,后一個方法可將前一方法的操作數作為當前方法的局部變量,從而節(jié)省數據copy帶來的消耗。下面再來看一下JVM學習筆記之類執(zhí)行機制的第二部分內容字節(jié)碼編譯執(zhí)行。
2。字節(jié)碼編譯執(zhí)行
解釋執(zhí)行的效率較低,為提升代碼執(zhí)行性能,SunJDK提供將字節(jié)碼編譯為機器碼的支持,編譯在運行時進行,通常稱為JIT編譯器。SunJDK在執(zhí)行過程中,對執(zhí)行頻率不頻繁的代碼采用解釋執(zhí)行,執(zhí)行頻率高的代碼采用編譯執(zhí)行。
SunJDK主要的優(yōu)化:
ClientCompiler(C1):
方法內聯(lián):-XX:MaxInlineSize=字節(jié)數進行控制。
去虛擬化:進行類的層次的分析,如發(fā)現類中的方法只提供一個實現類,那么可以對調用此方法的代碼進行方法內聯(lián)。
多余消除:根據運行狀況進行代碼折疊或消除。
ServerCompiler(C2):
標量替換:用標量替換聚合量,如:用基本類型替換對象。
棧上分配(TLAB):對于未逃逸對象可以直接在棧上分配,而不是JVM堆上。
同步消除:如果發(fā)現同步對象未逃逸,可以去掉同步。
SunJDK之所以未在啟動時即編譯成機器碼,有幾方面原因:
根據運行狀況來進行動態(tài)編譯,為C2收集運行數據的越長的時間,編譯出來的代碼會比靜態(tài)編譯更優(yōu)越。
解釋執(zhí)行比編譯執(zhí)行更節(jié)省內存。
啟動時解釋執(zhí)行的啟動速度比編譯再啟動執(zhí)行更快。
(小記:當java-server出現Error:no`server'JVMat`XXX\bin\server\jvm.dll'錯誤時,解決方法可以復制jdk下jre\bin\server目錄到jre7\bin目錄下;或windows下可以通過修改注冊表HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\JavaRuntimeEnvironment;UNIX下更改/usr/java的鏈接)
3。反射執(zhí)行
基于反射可動態(tài)調用某對象實例中對應的方法、訪問查看對象的數據等。最直接的方法是動態(tài)生成字節(jié)碼:Class.forName(Class'sName)。
getMethod相對比較耗性能(裝載Class對象、各種(權限等)校驗Class、執(zhí)行構造對象的netInstance、所有方法的掃描及Method對象的復制、......),反射執(zhí)行獲取的方法與標準的方法調用沒有任何區(qū)別(method.invoke僅比直接調用低一點),所以可采用緩存getMethod返回的Method對象來提升性能。
標題名稱:JVM學習筆記之常見JVM機制
鏈接分享:http://www.5511xx.com/article/dpeijos.html


咨詢
建站咨詢
