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

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

1. 編譯閾值 1.1. 一旦代碼執行到一定次數,就達到了它的編譯閾值,編譯器就會認為它有足夠的信息來編譯代碼 1.2. 在當前的JVM中,優化閾值的意義不大 1.2.1. 從JDK 7以及更早期遺留下來的 1.3. -XX:CompileThreshold=N 1.3.1. 當禁用分層編譯時有效 ...


1. 編譯閾值

1.1. 一旦代碼執行到一定次數,就達到了它的編譯閾值,編譯器就會認為它有足夠的信息來編譯代碼

1.2. 在當前的JVM中,優化閾值的意義不大

1.2.1. 從JDK 7以及更早期遺留下來的

1.3. -XX:CompileThreshold=N

1.3.1. 當禁用分層編譯時有效

1.3.2. 預設值是10 00

1.3.3. 降低這個標誌的值可以改善使用C2編譯器的應用程式的啟動時間

1.3.3.1. 可能會導致一些方法被編譯,而這些方法本來是永遠都不會被編譯的

1.4. 編譯器使用的計數器會隨著方法和迴圈的執行增加計數,但是它們也會隨著時間的推移而減少

1.4.1. 計數器只是方法或迴圈最近熱度的相對度量

1.4.2. 有些頻繁執行的代碼可能永遠不會被C2編譯器編譯,即使這個程式永遠運行

1.5. -XX:Tier3InvocationThreshold=N

1.5.1. 預設值200

1.5.2. 讓C1編譯器更快地編譯方法

1.6. -XX:Tier4InvocationThreshold=N

1.6.1. 預設值5000

1.6.2. 讓C2編譯器更快地編譯方法

2. 編譯線程

2.1. 調用次數更多的方法有更高的優先順序

2.1.1. 可以確保最重要的方法先被編譯

2.2. 需要編譯的代碼會放在編譯隊列中

2.2.1. 隊列中的代碼越多,應用程式達到最佳性能需要的時間就越長

2.3. C1編譯器和C2編譯器有不同的隊列

2.3.1. 對於放在編譯隊列中的方法,編譯是非同步進行的

2.4. -XX:CICompilerCount=N

2.4.1. JVM用來處理隊列的匯流排程數

2.4.2. 三分之一(至少一個)用來處理C1編譯器隊列

2.4.3. 剩下的線程(也是至少一個)用來處理C2編譯器隊列

2.4.4. 如果分層編譯被禁用,則只啟動給定數量的C2編譯器線程

2.5. 在Docker容器中運行舊版本的JDK 8會導致自動優化出問題

2.5.1. 需要手動將此標誌設置為需要的值

2.6. 可用的CPU有限,較少的線程競爭系統資源對性能有益

2.6.1. 減少線程數量可以幫助提升整體吞吐量

2.6.2. 代價是預熱期會持續更長時間

2.7. -XX:+BackgroundCompilation

2.7.1. 預設值為true

2.7.1.1. 意味著隊列會進行非同步處理

2.7.2. 設置為false

2.7.2.1. 一旦方法可以被編譯,想要執行它的代碼就會等待,直到方法實際上完成編譯,而不是繼續在解釋器中執行

2.8. -Xbatch

2.8.1. 可以禁用後臺編譯

3. 內聯

3.1. 對性能提升非常重要

3.1.1. 編譯器能做的最有利的優化,特別是對於屬性封裝良好的面向對象代碼

3.1.2. 不要害怕小方法,特別是getter和setter,因為它們很容易被內聯

3.2. -XX:-Inline

3.2.1. 預設啟用

3.3. -XX:MaxFreqInlineSize=N

3.3.1. 頻繁內聯

3.3.2. 預設325位元組

3.3.3. 一個方法因為調用得很頻繁而可以被內聯,那麼只有在它的位元組碼小於325位元組時

3.4. -XX:MaxInlineSize=N

3.4.1. 正常內聯

3.4.2. 預設35位元組

3.4.3. 只有在位元組碼小於35位元組時,方法才會被內聯

3.4.4. 它可能會縮短測試所需的預熱時間,但是不太可能對一個長期運行的應用程式產生很大影響

3.5. 註意事項

3.5.1. 將MaxInlineSize的值設置為大於35位元組,意味著一個方法在首次調用時可能就被內聯了

3.5.2. 如果方法經常被調用,就說明它的性能重要得多,它總歸是會被內聯的(假設它小於325位元組)

4. 逃逸分析

4.1. 編譯器能夠進行的最複雜的優化

4.1.1. 常導致微基準測試出錯

4.1.2. 可以產生更快的代碼,但複雜迴圈結構和大型方法限制了有效性

4.2. -XX:+DoEscapeAnalysis

4.2.1. 預設值是true

4.2.2. C2編譯器會進行大幅度的優化

4.2.3. 在極少數情況下,它會出錯

4.2.4. 禁用這個特性可能會帶來更穩定的代碼


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

-Advertisement-
Play Games
更多相關文章
  • 初探富文本之CRDT協同實例 在前邊初探富文本之CRDT協同演算法一文中我們探討了為什麼需要協同、分散式的最終一致性理論、偏序集與半格的概念、為什麼需要有偏序關係、如何通過數據結構避免衝突、分散式系統如何進行同步調度等等,這些屬於完成協同所需要瞭解的基礎知識,實際上當前有很多成熟的協同實現,例如aut ...
  • 功能介紹 平臺採用B/S結構,後端採用主流的Python語言進行開發,前端採用主流的Vue.js進行開發。 整個平臺包括前臺和後臺兩個部分。 前臺功能包括:首頁、圖書詳情頁、用戶中心模塊。 後臺功能包括:總覽、借閱管理、圖書管理、分類管理、標簽管理、評論管理、用戶管理、運營管理、日誌管理、系統信息模 ...
  • Canvas var canvas = document.querySelector('.myCanvas'); var width = canvas.width = window.innerWidth; var height = canvas.height = window.innerHeight ...
  • 離職在家 閑來無事看最近ChatGPT很火 花了一天時間 用Uniapp寫了一個小程式端的ChatGPT,實在是看不慣~ 一大堆利用ChatGPT收費的應用(小程式) 整個開源的玩玩 另外主要是自己本身是後端開發人員~ 剛好用uniapp實踐一下小程式開發 先看看主頁面效果圖吧 演示視頻-> 做一個 ...
  • 前言 用數據生成CAD圖,一般採用的ObjectArx對CAD二次開發完成。ObjectARX是AutoDesk公司針對AutoCAD平臺上的二次開發而推出的一個開發軟體包,它提供了以C++為基礎的面向對象的開發環境及應用程式介面,能訪問和創建AutoCAD圖形資料庫。而由於現在懂C++的人少,很多 ...
  • 這篇文章主要描述如何進行消息隊列產品選型,包括產品選型需要考慮的因素、三種比較流行的消息隊列產品的優缺點以及如何根據我們的使用場景選擇合適的消息隊列產品。 ...
  • OneAPM 摘要:此篇文章主要介紹Java8 Lambda 表達式產生的背景和用法,以及 Lambda 表達式與匿名類的不同等。本文系OneAPM工程師編譯整理。 Java是一流的面向對象語言,除了部分簡單數據類型,Java 中的一切都是對象,即使數組也是一種對象,每個類創建的實例也是對象。在 J ...
  • 在企業的商業活動中,訂單是指交易雙方的產品或服務交易意向。交易下單負責創建這個交易雙方的產品或服務交易意向,有了這個意向後,買方可以付款,賣方可以發貨。 在電商場景下,買賣雙方沒有面對面交易,許多情況下需要通過超時處理自動關閉訂單 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...