JVM中的編譯器

来源:https://www.cnblogs.com/FangwayLee/archive/2023/04/20/17338548.html
-Advertisement-
Play Games

JVM中集成了兩種編譯器,Client Compiler和Server Compiler,它們的作用也不同。Client Compiler註重啟動速度和局部的優化,Server Compiler則更加關註全局的優化,性能會更好,但由於會進行更多的全局分析,所以啟動速度會變慢。兩種編譯器有著不同的應用 ...


JVM中集成了兩種編譯器,Client Compiler和Server Compiler,它們的作用也不同。Client Compiler註重啟動速度和局部的優化,Server Compiler則更加關註全局的優化,性能會更好,但由於會進行更多的全局分析,所以啟動速度會變慢。兩種編譯器有著不同的應用場景,在虛擬機中同時發揮作用。

Client Compiler

HotSpot VM帶有一個Client Compiler C1編譯器。這種編譯器啟動速度快,但是性能比較Server Compiler來說會差一些。C1會做三件事:

  • 局部簡單可靠的優化,比如位元組碼上進行的一些基礎優化,方法內聯、常量傳播等,放棄許多耗時較長的全局優化。
  • 將位元組碼構造成高級中間表示(High-level Intermediate Representation,以下稱為HIR),HIR與平臺無關,通常採用圖結構,更適合JVM對程式進行優化。
  • 最後將HIR轉換成低級中間表示(Low-level Intermediate Representation,以下稱為LIR),在LIR的基礎上會進行寄存器分配、窺孔優化(局部的優化方式,編譯器在一個基本塊或者多個基本塊中,針對已經生成的代碼,結合CPU自己指令的特點,通過一些認為可能帶來性能提升的轉換規則或者通過整體的分析,進行指令轉換,來提升代碼性能)等操作,最終生成機器碼。

Server Compiler

Server Compiler主要關註一些編譯耗時較長的全局優化,甚至會還會根據程式運行的信息進行一些不可靠的激進優化。這種編譯器的啟動時間長,適用於長時間運行的後臺程式,它的性能通常比Client Compiler高30%以上。目前,Hotspot虛擬機中使用的Server Compiler有兩種:C2和Graal。

C2 Compiler

在Hotspot VM中,預設的Server Compiler是C2編譯器。

C2編譯器在進行編譯優化時,會使用一種控制流與數據流結合的圖數據結構,稱為Ideal Graph。 Ideal Graph表示當前程式的數據流向和指令間的依賴關係,依靠這種圖結構,某些優化步驟(尤其是涉及浮動代碼塊的那些優化步驟)變得不那麼複雜。

Ideal Graph的構建是在解析位元組碼的時候,根據位元組碼中的指令向一個空的Graph中添加節點,Graph中的節點通常對應一個指令塊,每個指令塊包含多條相關聯的指令,JVM會利用一些優化技術對這些指令進行優化,比如Global Value Numbering、常量摺疊等,解析結束後,還會進行一些死代碼剔除的操作。生成Ideal Graph後,會在這個基礎上結合收集的程式運行信息來進行一些全局的優化,這個階段如果JVM判斷此時沒有全局優化的必要,就會跳過這部分優化。

無論是否進行全局優化,Ideal Graph都會被轉化為一種更接近機器層面的MachNode Graph,最後編譯的機器碼就是從MachNode Graph中得的,生成機器碼前還會有一些包括寄存器分配、窺孔優化等操作。關於Ideal Graph和各種全局的優化手段會在後面的章節詳細介紹。Server Compiler編譯優化的過程如下圖所示:

Graal Compiler

從JDK 9開始,Hotspot VM中集成了一種新的Server Compiler,Graal編譯器。相比C2編譯器,Graal有這樣幾種關鍵特性:

  • 前文有提到,JVM會在解釋執行的時候收集程式運行的各種信息,然後編譯器會根據這些信息進行一些基於預測的激進優化,比如分支預測,根據程式不同分支的運行概率,選擇性地編譯一些概率較大的分支。Graal比C2更加青睞這種優化,所以Graal的峰值性能通常要比C2更好。
  • 使用Java編寫,對於Java語言,尤其是新特性,比如Lambda、Stream等更加友好。
  • 更深層次的優化,比如虛函數的內聯、部分逃逸分析等。

Graal編譯器可以通過Java虛擬機參數-XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler啟用。當啟用時,它將替換掉HotSpot中的C2編譯器,並響應原本由C2負責的編譯請求。

 

參考原文:基本功 | Java即時編譯器原理解析及實踐 - 美團技術團隊 (meituan.com)

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本章目標:監聽器是如何實現的?監聽器選項 - immediate、deep 內部實現?在初始化Vue實例時,我們會給每個偵聽器都創建一個對應watcher,我們稱之為偵聽器watcher ...
  • 在JavaScript中, for...in 和 for...of 都是用於迭代迴圈的結構: 1. for...in 迴圈: for...in 迴圈主要用於遍歷對象的可枚舉屬性。這種迴圈不僅遍歷對象自身的屬性,還會遍歷原型鏈上的可枚舉屬性。它的語法如下: for (variable in objec ...
  • 簡介 備忘錄模式(Memento Pattern)是一種結構型設計模式。這種模式就是在不破壞封裝的條件下,將一個對象的狀態捕捉(Capture)住,並放在外部存儲起來,從而可以在將來合適的時候把這個對象還原到存儲起來的狀態。備忘錄模式常常與命令模式和迭代子模式一同使用。 備忘錄模式的角色有三個:備忘 ...
  • 結合京東業務研發實際情況,針對後端研發人員,設計一個微服務低代碼平臺,助力更高效低交付業務需求。現已結業,將我在本次項目中沉澱設計出的設計文檔整理成文,期待與大家有進一步的碰撞溝通 ...
  • 下載Opencv 先去官網https://opencv.org/opencv-4-7-0/下載, 找到適合你設備的版本下載Windows就是Win pack,完成後進行安裝即可,一路同意預設就行,可以更改安裝位置,但路徑上儘可能以英文,以防止後面不必要的問題。 2.下載Python 首先是版本 發文 ...
  • 說明 使用 VLD 記憶體泄漏檢測工具輔助開發時整理的學習筆記。本篇介紹 VLD 源碼的下載。同系列文章目錄可見 《記憶體泄漏檢測工具》目錄 1. 下載途徑 以 v2.5.1 版本為例,可以到 Github-KindDragon-vld 頁面下載 master 的 zip 源碼包,如下所示: 也可以到 ...
  • 相信大家在學習 Java 的過程中,或多或少都見過 JSR 這個詞。本篇文章就科普下什麼是 JSR。 什麼是 JSR ? JSR(Java Specification Requests),是指 Java 規範請求(或者活規範提案)。這個請求(提案)是提給 JCP 的(Java Community P ...
  • 上周末,去參加了北京思否 hackathon,兩天時間內從腦暴 & 挖掘軟體 IDEA -> Demo 研發路演,這次經歷讓我難忘。這裡我的看法是每個開發者圈友,都應該去參加一次 hackathon ~ 做 niche 軟體正確的方法 這邊先說結論,如圖。我認為 做 niche 軟體正確的方法 或 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...