讀Java性能權威指南(第2版)筆記09_即時編譯器下

来源:https://www.cnblogs.com/lying7/archive/2023/03/07/17181666.html
-Advertisement-
Play Games

1. CPU相關代碼 1.1. Advanced Vector Extensions 1.1.1. AVX 1.1.2. 2013年,Intel為Haswell以及之後的晶元引入了AVX2 1.1.3. 2016年,Intel又引入了AVX-512指令 1.1.4. JDK 8不支持這些指令 1.1 ...


1. CPU相關代碼

1.1. Advanced Vector Extensions

1.1.1. AVX

1.1.2. 2013年,Intel為Haswell以及之後的晶元引入了AVX2

1.1.3. 2016年,Intel又引入了AVX-512指令

1.1.4. JDK 8不支持這些指令

1.1.5. JDK 11支持

1.2. -XX:UseAVX=N

1.2.1. 0

1.2.1.1. 不使用AVX指令

1.2.2. 1

1.2.2.1. 使用Intel AVX 1指令(對於Sandy Bridge和之後的處理器)

1.2.3. 2

1.2.3.1. 使用Intel AVX 2指令(對於Haswell和之後的處理器)

1.2.4. 3

1.2.4.1. 使用Intel AVX-512指令(對於Knights Landing和之後的處理器)

1.3. -XX:UseSSE=N

1.3.1. 支持Intel流SIMD擴展1到4

1.3.1.1. Streaming SIMD Extensions,SSE

1.3.2. 針對奔騰系列處理器的

2. 分層編譯的權衡

2.1. 當在記憶體受限的環境中運行時有理由關閉它

2.2. 給定足夠長的預熱期,禁用分層編譯時的執行情況和開啟時應該是差不多的

2.3. javac編譯器

2.3.1. 包含額外調試信息的-g標誌不會影響性能

2.3.2. 在Java應用程式中使用final關鍵字並不能更快地編譯代碼

2.3.3. 用較新的javac版本重新編譯通常不會使應用程式更快

2.3.3.1. JDK 11引入了一種新的字元串連接方式,可以比以前的版本更快,但需要重新編譯代碼才能用

3. GraalVM

3.1. 一個新的虛擬機

3.1.1. 可以運行許多其他語言的代碼

3.2. 兩個版本

3.2.1. 完全開源的社區版(Community Edition,CE)

3.2.1.1. 社區版比企業版慢

3.2.2. 商用的企業版(Enterprise Edition,EE)

3.3. 對JVM性能有兩個重要貢獻

3.3.1. 插件技術允許GraalVM生成完全原生的二進位文件

3.3.2. 以常規JVM的模式運行,只是它包含了一個新的C2編譯器實現

3.3.2.1. 這個編譯器是用Java寫的

3.3.2.2. 傳統的C2編譯器是用C++寫的

3.4. -XX:+UnlockExperimentalVMOptions

3.4.1. 預設值是false

3.5. -XX:+EnableJVMCI

3.5.1. 預設值是false

3.6. -XX:+UseJVMCICompiler

3.6.1. 預設值是false

4. 提前編譯

4.1. ahead-of-time compilation,簡稱AOT compilation

4.2. 最初僅在JDK 9的Linux版本中可用

4.2.1. JDK 11時所有平臺都可以用了

4.3. 啟動速度更快

4.3.1. 目前,應用程式類數據共用給啟動性能帶來的提升更大,而且它已經是平臺完全支持的特性

4.3.2. 提前編譯針對的是像REST伺服器這樣啟動時間相對比較長的程式

4.3.2.1. 載入共用庫的時間就被較長的啟動時間抵消了,提前編譯就更有優勢

4.4. jaotc工具

4.4.1. 生成一個共用庫,其中包含你選出的編譯過的類

4.4.2. 然後通過運行參數將共用庫載入到JVM中

$ java -XX:+UnlockDiagnosticVMOptions -XX:+LogTouchedMethods \
      -XX:+PrintTouchedMethodsAtExit <other arguments>
java/net/URI.getHost:()Ljava/lang/String;

4.4.5. 為了生成methods.txt文件,需要保存這些輸出內容,然後在每一行前添加compileOnly命令並刪除方法參數之前的冒號

$ jaotc --compile-commands=/tmp/methods.txt \
    --output JavaBaseFilteredMethods.so \
    --compile-for-tiered \
    --module java.base

4.4.7. /tmp/methods.txt文件中

compileOnly java.net.URI.getHost()Ljava/lang/String;

4.5. 如果不讓預編譯的方法被C2編譯器編譯,那麼伺服器預熱後的性能就會比它最終可能達到的性能差

4.6. -XX:+PrintAOT

4.6.1. 在預編譯方法被JVM使用時會產生輸出

4.6.2. 預設值是false

4.7. 對於比較大的程式有好處

4.8. 對於很小的、快速運行的程式沒有幫助,甚至會阻礙它們的運行

5. GraalVM原生編譯

5.1. 生成不需要JVM的可執行文件

5.1.1. 是短期程式的理想選擇

5.2. 生成的二進位文件啟動速度很快,特別是相較於在JVM中運行的程式

5.3. GraalVM優化代碼時並沒有C2編譯器那麼激進,所以對於運行得足夠久的應用程式,傳統的JVM最終會勝出

5.4. GraalVM原生二進位文件在執行期間不會使用C2編譯器編譯類

5.5. 原生程式的記憶體占用在開始時比傳統JVM少得多

5.5.1. 隨著程式的運行和堆的增長,這種記憶體優勢會逐漸消失


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

-Advertisement-
Play Games
更多相關文章
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 需求描述 如果想要做一個app的話,可以有很多種選擇方案,uni-app是其中的一個性價比高一些(坑多一些)的方案。本文記錄一下,uni-app打安卓包以後,需要檢查並下載更新,且顯示進度條的功能。 代碼在自己公司項目中應用,大家可放心使 ...
  • 1、首先 首先要解釋下,函數體內變數的作用域是在函數定義的時候就確定的,而不是運行時; 函數的上下文是在調用時確定的,函數體內的this指向其上下文; 箭頭函數沒有自己的this,它的this指向的是它上級的this,而它上級的this指向的是上級的上下文。 2、普通函數的this,指向其調用者,箭 ...
  • 三角形 有人說三維模型的基本單元是三角形。比如複雜的游戲角色,也只是用許多三角形畫出來的。 不管上述說法是否屬實,本篇先把三角形畫出來。 如何繪製一個三角形 滑鼠點擊繪點示例我們寫了這樣的代碼: points.forEach(item => { gl.vertexAttrib3f(a_Positio ...
  • 前端中的工廠模式是一種創建對象的設計模式,它可以讓我們封裝創建對象的細節,我們使用工廠方法而不是直接調用 new 關鍵字來創建對象,使得代碼更加清晰、簡潔和易於維護。在前端開發中,工廠模式通常用於創建多個相似但稍有不同的對象,比如創建一系列具有相同樣式和行為的按鈕或者表單。 在實現工廠模式時,通常需 ...
  • 最近公司組織架構調整,整個組換到新部門,需要將原來組內的項目代碼,全部遷移到新的 group 中去(公司用的 gitlab 伺服器),要求保留所有的提交記錄、分支和標簽。我當然知道 Gitlab 本身是支持創建倉庫時通過鏈接導入的,但前提是管理員開啟相關功能。我們此處只講命令遷移方案。 ...
  • ECS全稱Entity-Component-System,即實體-組件-系統。是一種面向數據(Data-Oriented Programming)的編程架構模式。本文介紹了ECS架構的基本思想,特點推論,細節討論、代碼原型示例,歡迎大家留言討論! ...
  • 前言:記得很久之前,去面試過位元組跳動。被三面的面試官問了一道場景設計題目:如何設計一個高併發系統。當時我回答得比較粗糙,最近回想起來,所以整理了設計高併發系統的15個錦囊,相信大家看完會有幫助的。 ...
  • 不能否認,微軟Azure在TTS(text-to-speech文字轉語音)這個人工智慧細分領域的影響力是統治級的,一如ChatGPT在NLP領域的隨心所欲,予取予求。君不見幾乎所有的抖音營銷號口播均採用微軟的語音合成技術,其影響力由此可見一斑,僅有的白璧微瑕之處就是價格略高,雖然國內也可以使用科大訊 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...