91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

Java中為什么需要平衡方法調用

發布時間:2021-01-29 17:12:38 來源:億速云 閱讀:104 作者:Leah 欄目:開發技術

這篇文章給大家介紹Java中為什么需要平衡方法調用,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

在 Java 中,方法調用一般通過 Virtual Call 還有 Classic Call。

Classic Call 就是直接指向方法的地址,需要一次尋址到方法的地址,比直接執行代碼慢。

Virtual Call 需要通過 VMT(Virtual Method Table)。這個VMT存儲的是該class對象中所有的Virtual Method,程序運行的時候首先加載實例對象,然后通過實例對象找到VMT,通過VMT再找到對應的方法地址,再執行代碼。所以比 Classic Call 更慢。

Java 中除了 static 方法,private 方法以及構造器是 Classic Call 之外,基本都是 Virtual Call。

為了優化,JVM 運行時,JVM使用混合模式來從字節碼轉換成機器可以運行的機器碼,混合模式包括解釋器和JIT:

解釋器工作機制:

Java中為什么需要平衡方法調用

在編譯時,主要是將java源代碼文件編譯為java統一的字節碼,但是編譯成的字節碼并不能直接運行,而是通過JVM讀取運行。JVM中的解釋器就是將.class文件一行一行翻譯之后再運行,翻譯就是轉換成當前機器可以運行的機器碼,它不會一次性把整個文件都翻譯過來,而是翻譯一句,執行一句,再翻譯,再執行,所以解釋器的程序運行起來會比較慢,每次都要解釋之后再執行。所以,有些時候,我們想是否可以把解釋之后的內容緩存起來,這樣不就可以直接運行了?但是,如果每段代碼都要緩存起來,例如僅僅執行一次的代碼也緩存起來,這樣太浪費內存了。所以,引入一個新的運行時編譯器,JIT來解決這些問題,加速熱點代碼的執行。

JIT運行時編譯器工作機制: 

Java中為什么需要平衡方法調用

JIT針對熱點代碼,進行編譯與深度優化,優化后的機器碼會被緩存起來,存入CodeCache(代碼高速緩存)中。對于非熱點代碼,例如只運行一次的代碼(類構造器等等),直接解釋執行,更加快速。JIT不僅花更多時間去編譯優化,而且還多耗費了很多內存。字節碼轉換為可執行的機器碼,大小會大很多很多倍。這也是為啥,解釋器每次都要翻譯并且執行,JIT只針對熱點代碼進行編譯優化的原因。JIT編譯器執行的一些常見優化操作包括數據分析,從堆棧操作到寄存器操作的轉換,通過寄存器分配減少內存訪問,消除常見子表達式等。JIT編譯器進行的優化程度越高,在執行階段花費的時間越多。因此,JIT編譯器無法承擔所有靜態編譯器所做的優化,這不僅是因為增加了執行時間的開銷,而且還因為它只對程序進行了限制。這也就解釋了為什么有些JVM會選擇不總是做JIT編譯,而是選擇用解釋器+JIT編譯器的混合執行引擎。

JIT其中一項很重要的優化就是內聯: 內聯是將較小方法的樹合并或“內聯”到其調用者的樹中的過程。這樣可以加速頻繁執行的方法調用。不同分層優化階段,使用的算法不同。主要包括:

  • Trivial方法內聯

  • 調用圖內聯

  • 尾部遞歸消除

  • 虛擬調用優化

這樣省略了 calling method。但是,如果將所有方法都內聯的話,編譯出來的機器碼會很大很大,內存占用會急劇增高,效率低下。所以,需要 JIT 把握好這個優化的度

總結起來就是:JIT 是即時優化并編譯代碼,優化代碼包括內聯,編譯后的代碼保存在內存中,也就是代碼高速緩存,編譯后的代碼是很大的,所以不能所有代碼都編譯,需要是熱點代碼。并且,內聯也會將這個方法變得更大。代碼高速緩存也是需要清理的,代碼高速緩存占用過高,也會增加清理概率,因為你可能幾個方法都是高頻執行,但是編譯之后占用過大導致超過代碼高速緩存限制,那么會發生代碼高速緩存清理,就是代碼緩存中的編譯代碼一直在換。清理代碼高速緩存,會讓所有線程進入 Safepoint,然后才能清理,也就是 stop the world。內聯過多,方法變大,這種清理頻率也會變大。

關于Java中為什么需要平衡方法調用就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

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

AI

高台县| 公安县| 文登市| 牙克石市| 潍坊市| 郴州市| 宁国市| 海伦市| 临猗县| 库车县| 大足县| 靖西县| 宁波市| 历史| 应城市| 亳州市| 库车县| 偃师市| 尉犁县| 明溪县| 泾阳县| 赤城县| 威海市| 潼关县| 友谊县| 丹阳市| 恩平市| 宁远县| 灵宝市| 景泰县| 上饶县| 靖西县| 砀山县| 武平县| 苗栗县| 义马市| 永年县| 汕头市| 准格尔旗| 乐业县| 房产|