中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

常見JVM機制都有哪些

發布時間:2021-10-23 16:52:31 來源:億速云 閱讀:126 作者:柒染 欄目:編程語言

本篇文章為大家展示了常見JVM機制都有哪些,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

JVM機制

一、Java源碼編譯機制:

1。分析和輸入到符號表(ParserAndEnter):

詞法分析com.sun.tools.javac.parser.Scanner:將代碼字符串轉變為token序列。

語法分析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。

二、類加載機制(類加載器子系統的工作職責與工作流程):

1。裝載(Load):查找并裝載二進制字節碼,采用兩個元素來標識一個被加載的類:類的全限定名+ClassLoader實例ID。

2。鏈接(Link):校驗(Verify)--格式校驗確保被導入類的正確性-->準備(Prepared)--為類變量分配內存空間并初始化默認值-->解析(Resolve)--把導入類的符號引用轉換為直接引用。

3。初始化(Initialize):執行類中的靜態初始化代碼、構造器代碼及靜態屬性的初始化。

ClassLoader雙親委派模型:

BootstrapClassLoader--$JAVA_HOME/jre/lib/rt.jar(曾祖父)<--

ExtensionClassLoader--$JAVA_HOME/jre/lib/ext/*.jar(祖父)<--

SystemClassLoader--$CLASSPATH(父親)<--

User-DefinedClassLoader

三、JVM學習筆記之類執行機制:

SunJDK基于棧的體系結構來執行字節碼,代碼緊湊,體積小。調用方法invokestatic、invokespecial、invokevirtual、invokeinterface。

1。字節碼解釋執行

指令解釋執行:對于方法的指令解釋執行,執行方式為經典馮*諾依曼體系的FDX循環方式,有switching-threading、token-threading、direct-threading、subroutine-threading、inline-threading。

SunJDK主要的優化:

棧頂緩存(top-of-stackcaching):即將本來位于操作棧頂的值直接緩存到寄存器上,這對于大部分只需要一個值的操作而言,無須將數據放入操作數棧,可直接在寄存器計算,然后返回操作數棧。

部分棧幀共享:當方法調用時,后一個方法可將前一方法的操作數作為當前方法的局部變量,從而節省數據copy帶來的消耗。下面再來看一下JVM學習筆記之類執行機制的第二部分內容字節碼編譯執行。

2。字節碼編譯執行

解釋執行的效率較低,為提升代碼執行性能,SunJDK提供將字節碼編譯為機器碼的支持,編譯在運行時進行,通常稱為JIT編譯器。SunJDK在執行過程中,對執行頻率不頻繁的代碼采用解釋執行,執行頻率高的代碼采用編譯執行。

SunJDK主要的優化:

ClientCompiler(C1):

方法內聯:-XX:MaxInlineSize=字節數進行控制。

去虛擬化:進行類的層次的分析,如發現類中的方法只提供一個實現類,那么可以對調用此方法的代碼進行方法內聯。

多余消除:根據運行狀況進行代碼折疊或消除。

ServerCompiler(C2):

標量替換:用標量替換聚合量,如:用基本類型替換對象。

棧上分配(TLAB):對于未逃逸對象可以直接在棧上分配,而不是JVM堆上。

同步消除:如果發現同步對象未逃逸,可以去掉同步。

SunJDK之所以未在啟動時即編譯成機器碼,有幾方面原因:

根據運行狀況來進行動態編譯,為C2收集運行數據的越長的時間,編譯出來的代碼會比靜態編譯更優越。

解釋執行比編譯執行更節省內存。

啟動時解釋執行的啟動速度比編譯再啟動執行更快。

(小記:當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。反射執行

基于反射可動態調用某對象實例中對應的方法、訪問查看對象的數據等。最直接的方法是動態生成字節碼:Class.forName(Class'sName)。

getMethod相對比較耗性能(裝載Class對象、各種(權限等)校驗Class、執行構造對象的netInstance、所有方法的掃描及Method對象的復制、......),反射執行獲取的方法與標準的方法調用沒有任何區別(method.invoke僅比直接調用低一點),所以可采用緩存getMethod返回的Method對象來提升性能。

上述內容就是常見JVM機制都有哪些,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

jvm
AI

杭州市| 渝中区| 聂荣县| 三门峡市| 德江县| 类乌齐县| 阜康市| 景东| 甘德县| 浮梁县| 清苑县| 万州区| 隆林| 平度市| 沐川县| 定兴县| 建德市| 泌阳县| 文昌市| 旺苍县| 墨玉县| 皮山县| 横山县| 麻江县| 聂拉木县| 宣威市| 稻城县| 通江县| 宁都县| 翁牛特旗| 东乡| 翼城县| 八宿县| 蕲春县| 平武县| 新宁县| 尚义县| 新郑市| 龙井市| 海丰县| 营口市|