OpenJDK 17 JIT編譯器堆棧分析

##堆棧

(gdb) bt
#0  PhaseOutput::safepoint_poll_table (this=0x7fffd0bfb950) at /home/yym/openjdk17/jdk17-master/src/hotspot/share/opto/output.hpp:173
#1  0x00007ffff689634e in PhaseOutput::fill_buffer (this=0x7fffd0bfb950, cb=0x7fffd0bfb970, blk_starts=0x7fffb0042e40)at /home/yym/openjdk17/jdk17-master/src/hotspot/share/opto/output.cpp:1824
#2  0x00007ffff6890444 in PhaseOutput::Output (this=0x7fffd0bfb950) at /home/yym/openjdk17/jdk17-master/src/hotspot/share/opto/output.cpp:432
#3  0x00007ffff602fe6b in Compile::Code_Gen (this=0x7fffd0bfde90) at /home/yym/openjdk17/jdk17-master/src/hotspot/share/opto/compile.cpp:2775
#4  0x00007ffff6027214 in Compile::Compile (this=0x7fffd0bfde90, ci_env=0x7fffd0bfeac0, generator=0x7ffff695a52a <OptoRuntime::monitor_notify_Type()>,stub_function=0x7ffff6959db8 <OptoRuntime::monitor_notify_C(oopDesc*, JavaThread*)> "\363\017\036\372UH\211\345SH\203\354hH\211}\230H\211u\220H\213U\220H\215E\300H\211\326H\211\307\350\346rN\377\350\030?\377\203\360\001\204\300t&H\213M\220H\213E\230\272", stub_name=0x7ffff72816b7 "_monitor_notify_Java", is_fancy_jump=0, pass_tls=false, return_pc=false, directive=0x7ffff01b1f90)at /home/yym/openjdk17/jdk17-master/src/hotspot/share/opto/compile.cpp:925
#5  0x00007ffff6958b70 in OptoRuntime::generate_stub (env=0x7fffd0bfeac0, gen=0x7ffff695a52a <OptoRuntime::monitor_notify_Type()>,C_function=0x7ffff6959db8 <OptoRuntime::monitor_notify_C(oopDesc*, JavaThread*)> "\363\017\036\372UH\211\345SH\203\354hH\211}\230H\211u\220H\213U\220H\215E\300H\211\326H\211\307\350\346rN\377\350\030?\377\203\360\001\204\300t&H\213M\220H\213E\230\272", name=0x7ffff72816b7 "_monitor_notify_Java", is_fancy_jump=0, pass_tls=false, return_pc=false)at /home/yym/openjdk17/jdk17-master/src/hotspot/share/opto/runtime.cpp:171
#6  0x00007ffff6958934 in OptoRuntime::generate (env=0x7fffd0bfeac0) at /home/yym/openjdk17/jdk17-master/src/hotspot/share/opto/runtime.cpp:148
#7  0x00007ffff5f07753 in C2Compiler::init_c2_runtime () at /home/yym/openjdk17/jdk17-master/src/hotspot/share/opto/c2compiler.cpp:78
#8  0x00007ffff5f077d7 in C2Compiler::initialize (this=0x7ffff02c01f0) at /home/yym/openjdk17/jdk17-master/src/hotspot/share/opto/c2compiler.cpp:91
#9  0x00007ffff6043287 in CompileBroker::init_compiler_runtime () at /home/yym/openjdk17/jdk17-master/src/hotspot/share/compiler/compileBroker.cpp:1801
#10 0x00007ffff6043806 in CompileBroker::compiler_thread_loop () at /home/yym/openjdk17/jdk17-master/src/hotspot/share/compiler/compileBroker.cpp:1938
#11 0x00007ffff6065c02 in CompilerThread::thread_entry (thread=0x7ffff02c08c0, __the_thread__=0x7ffff02c08c0)at /home/yym/openjdk17/jdk17-master/src/hotspot/share/compiler/compilerThread.cpp:59
#12 0x00007ffff6b5e498 in JavaThread::thread_main_inner (this=0x7ffff02c08c0) at /home/yym/openjdk17/jdk17-master/src/hotspot/share/runtime/thread.cpp:1305
#13 0x00007ffff6b5e32e in JavaThread::run (this=0x7ffff02c08c0) at /home/yym/openjdk17/jdk17-master/src/hotspot/share/runtime/thread.cpp:1288
#14 0x00007ffff6b5ba31 in Thread::call_run (this=0x7ffff02c08c0) at /home/yym/openjdk17/jdk17-master/src/hotspot/share/runtime/thread.cpp:394
#15 0x00007ffff68752bb in thread_native_entry (thread=0x7ffff02c08c0) at /home/yym/openjdk17/jdk17-master/src/hotspot/os/linux/os_linux.cpp:720
#16 0x00007ffff7c94ac3 in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:442
#17 0x00007ffff7d26850 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81Thread 14 "C2 CompilerThre" hit Breakpoint 5, PhaseOutput::safepoint_poll_table (this=0x7fffd0bfb950) at /home/yym/openjdk17/jdk17-master/src/hotspot/share/opto/output.hpp:173
173       C2SafepointPollStubTable* safepoint_poll_table() { return &_safepoint_poll_table; }
(gdb) bt
#0  PhaseOutput::safepoint_poll_table (this=0x7fffd0bfb950) at /home/yym/openjdk17/jdk17-master/src/hotspot/share/opto/output.hpp:173
#1  0x00007ffff689634e in PhaseOutput::fill_buffer (this=0x7fffd0bfb950, cb=0x7fffd0bfb970, blk_starts=0x7fffb0033610)at /home/yym/openjdk17/jdk17-master/src/hotspot/share/opto/output.cpp:1824
#2  0x00007ffff6890444 in PhaseOutput::Output (this=0x7fffd0bfb950) at /home/yym/openjdk17/jdk17-master/src/hotspot/share/opto/output.cpp:432
#3  0x00007ffff602fe6b in Compile::Code_Gen (this=0x7fffd0bfde90) at /home/yym/openjdk17/jdk17-master/src/hotspot/share/opto/compile.cpp:2775
#4  0x00007ffff6027214 in Compile::Compile (this=0x7fffd0bfde90, ci_env=0x7fffd0bfeac0, generator=0x7ffff695a0fe <OptoRuntime::new_array_Type()>,stub_function=0x7ffff6959052 <OptoRuntime::new_array_nozero_C(Klass*, int, JavaThread*)> "\363\017\036\372UH\211\345H\201", <incomplete sequence \354\220>,stub_name=0x7ffff728160d "_new_array_nozero_Java", is_fancy_jump=0, pass_tls=true, return_pc=false, directive=0x7ffff01b1f90)at /home/yym/openjdk17/jdk17-master/src/hotspot/share/opto/compile.cpp:925
#5  0x00007ffff6958b70 in OptoRuntime::generate_stub (env=0x7fffd0bfeac0, gen=0x7ffff695a0fe <OptoRuntime::new_array_Type()>,C_function=0x7ffff6959052 <OptoRuntime::new_array_nozero_C(Klass*, int, JavaThread*)> "\363\017\036\372UH\211\345H\201", <incomplete sequence \354\220>,name=0x7ffff728160d "_new_array_nozero_Java", is_fancy_jump=0, pass_tls=true, return_pc=false) at /home/yym/openjdk17/jdk17-master/src/hotspot/share/opto/runtime.cpp:171
#6  0x00007ffff69586d3 in OptoRuntime::generate (env=0x7fffd0bfeac0) at /home/yym/openjdk17/jdk17-master/src/hotspot/share/opto/runtime.cpp:141
#7  0x00007ffff5f07753 in C2Compiler::init_c2_runtime () at /home/yym/openjdk17/jdk17-master/src/hotspot/share/opto/c2compiler.cpp:78
#8  0x00007ffff5f077d7 in C2Compiler::initialize (this=0x7ffff02c01f0) at /home/yym/openjdk17/jdk17-master/src/hotspot/share/opto/c2compiler.cpp:91
#9  0x00007ffff6043287 in CompileBroker::init_compiler_runtime () at /home/yym/openjdk17/jdk17-master/src/hotspot/share/compiler/compileBroker.cpp:1801
#10 0x00007ffff6043806 in CompileBroker::compiler_thread_loop () at /home/yym/openjdk17/jdk17-master/src/hotspot/share/compiler/compileBroker.cpp:1938
#11 0x00007ffff6065c02 in CompilerThread::thread_entry (thread=0x7ffff02c08c0, __the_thread__=0x7ffff02c08c0)at /home/yym/openjdk17/jdk17-master/src/hotspot/share/compiler/compilerThread.cpp:59
#12 0x00007ffff6b5e498 in JavaThread::thread_main_inner (this=0x7ffff02c08c0) at /home/yym/openjdk17/jdk17-master/src/hotspot/share/runtime/thread.cpp:1305
#13 0x00007ffff6b5e32e in JavaThread::run (this=0x7ffff02c08c0) at /home/yym/openjdk17/jdk17-master/src/hotspot/share/runtime/thread.cpp:1288
#14 0x00007ffff6b5ba31 in Thread::call_run (this=0x7ffff02c08c0) at /home/yym/openjdk17/jdk17-master/src/hotspot/share/runtime/thread.cpp:394
#15 0x00007ffff68752bb in thread_native_entry (thread=0x7ffff02c08c0) at /home/yym/openjdk17/jdk17-master/src/hotspot/os/linux/os_linux.cpp:720
#16 0x00007ffff7c94ac3 in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:442
#17 0x00007ffff7d26850 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

OpenJDK 17堆棧信息,分析如下:

核心結論

  1. 線程正在執行C2編譯器初始化工作:線程名為"C2 CompilerThre",說明這是C2編譯器線程(JIT編譯線程)。

  2. 處于運行時存根(Runtime Stub)生成階段:正在為JVM關鍵操作(如monitor_notifynew_array_nozero)生成本地代碼存根。

  3. 核心操作是代碼生成與安全點輪詢表處理:在PhaseOutput::fill_buffer()階段,正在處理安全點輪詢表(Safepoint Poll Table),用于JVM安全點檢查。


堆棧關鍵點解析

首次堆棧(生成monitor_notify存根)

plaintext

#4  Compile::Compile(... stub_function=OptoRuntime::monitor_notify_C ...)
#5  OptoRuntime::generate_stub(... name="_monitor_notify_Java" ...)
#7  C2Compiler::init_c2_runtime()
  • 目標存根:為Object.notify()方法生成本地代碼存根(_monitor_notify_Java)。

  • 作用:實現Java對象監視器(鎖)的喚醒操作。

第二次堆棧(生成new_array_nozero存根)

plaintext

#4  Compile::Compile(... stub_function=OptoRuntime::new_array_nozero_C ...)
#5  OptoRuntime::generate_stub(... name="_new_array_nozero_Java" ...)
#6  OptoRuntime::generate()
  • 目標存根:為數組分配生成本地代碼存根(_new_array_nozero_Java)。

  • 作用:優化new T[size]操作(跳過數組初始化為零的步驟)。


執行流程說明

  1. 初始化C2運行時
    C2Compiler::init_c2_runtime()?→ 觸發生成JVM關鍵操作的本地代碼存根。

  2. 存根生成

    • OptoRuntime::generate():選擇需要生成的存根類型。

    • OptoRuntime::generate_stub():具體存根生成入口。

    • 創建Compile對象,傳入存根函數指針(如monitor_notify_Cnew_array_nozero_C)。

  3. 代碼生成(JIT編譯)

    • Compile::Code_Gen():調用代碼生成模塊。

    • PhaseOutput::Output():進入代碼輸出階段。

    • PhaseOutput::fill_buffer():填充代碼緩沖區,處理安全點輪詢表。

  4. 安全點輪詢表處理

    • PhaseOutput::safepoint_poll_table():訪問安全點輪詢表。

    • 作用:在生成的本地代碼中插入安全點檢查點,確保JVM能在GC等操作時掛起線程。


關鍵組件作用

組件作用
C2編譯器線程后臺線程,負責將熱點Java方法編譯為本地代碼。
OptoRuntime運行時存根生成器,為JVM關鍵操作(如鎖、數組分配)提供優化后的本地代碼。
PhaseOutput代碼輸出模塊,負責將中間表示(IR)轉換為機器碼,并處理元數據(如安全點)。
安全點輪詢表存儲代碼中的安全點檢查位置,確保線程能響應JVM暫停請求(如GC)。

總結

  • 當前操作:C2編譯器線程正在為monitor_notifynew_array_nozero等JVM核心操作生成本地代碼存根

  • 核心任務:在代碼生成階段(PhaseOutput::fill_buffer)處理安全點輪詢表,確保生成的本地代碼能正確響應JVM安全點請求。

  • 背景目的:這些存根是JVM運行時的重要組成部分,用于優化高頻操作(如鎖、內存分配),提升Java程序性能。

簡單來說:這是JIT編譯器的初始化階段,正在為關鍵操作生成高效本地代碼,并確保這些代碼能與JVM的安全點機制協同工作。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/93217.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/93217.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/93217.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

功能測試中常見的面試題-二

二、測試設計與用例編寫題解釋等價類劃分 (Equivalence Partitioning) 和邊界值分析 (Boundary Value Analysis)&#xff1f;并舉例說明。等價類劃分 (EP)&#xff1a; 將輸入域劃分為若干組&#xff08;等價類&#xff09;&#xff0c;假設同一組內的數據對揭露程序錯誤具有等…

SOLi-LABS Page-4 (Challenges)--54-65關

sql-54 翻譯一下頁面&#xff0c;得知我們只有十次機會。id參數是單引號閉合。 ?id-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schemadatabase()-- 我得到的表名是igsyiz2p7z。&#xff08;每個人得到的應該都不一樣&#…

docker代碼如何在vscod上修改

基于 docker-compose.yml文件&#xff08;包含 ??emqx??&#xff08;MQTT服務&#xff09;、??backend??&#xff08;后端服務&#xff09;、??mysql??&#xff08;數據庫&#xff09;&#xff09;的詳細運行、調試、增改刪操作說明&#xff0c;結合流程圖示意&…

HTML5 CSS3 從入門到精通:構建現代Web的藝術與科學

本文將帶你系統地學習掌握現代Web前端的基礎與核心&#xff0c;最終能夠獨立構建語義清晰、布局靈活、交互豐富的專業級網站。 第一章&#xff1a;夯實基礎 - HTML5語義化與結構藝術 1.1 告別<div>混沌&#xff1a;語義化標簽的力量 <header><h1>網站標題…

C# 微軟依賴注入 (Microsoft.Extensions.DependencyInjection) 詳解

文章目錄 前言 核心原理 三大生命周期 核心接口與類 基礎使用示例 關鍵特性詳解 1、構造函數注入 2、作用域管理 3、服務解析方法 4、延遲加載 常見問題解決 問題1:循環依賴 問題2:多實現選擇 性能優化技巧 擴展方法示例 前言 微軟的依賴注入框架是 .NET Core/5+ 的核心組件…

【車聯網kafka】Kafka核心架構與實戰經驗(第四篇)

一、社團扛把子不為人知的秘密 香港社團里&#xff0c;Kafka 是整個組織的名號&#xff0c;ZooKeeper 就是說一不二的長老團&#xff0c;各個片區的 “話事人” 就是 broker&#xff0c;而能統領所有片區的 “扛把子”&#xff0c;就是 Kafka 里的控制器。? 1.1 選舉的秘密 每…

Scala重點(基礎、面向對象、高階函數、集合、模式匹配)

1. 基礎語法1.1. 注釋和java一樣我是單行注釋 /* 我是多行注釋 我是多行注釋 */ /** * 我是文檔注釋 * 我是文檔注釋 */1.2. 語句語句可以不以分號結尾一條語句獨占一行 println("Hello World!")多條語句在一行 println("Hello World!"); println("He…

明遠智睿T113-i核心板:工業設備制造領域的革新利器

在工業設備制造這片充滿挑戰與機遇的領域&#xff0c;技術革新如同一股洶涌浪潮&#xff0c;不斷重塑著市場競爭的格局。隨著技術持續進步&#xff0c;市場競爭愈發激烈&#xff0c;制造商們面臨著如何在保證產品卓越性能的同時&#xff0c;有效控制成本這一關鍵難題。在此背景…

122-基于Flask的校園霸凌數據可視化分析系統

校園霸凌數據可視化分析系統 - 基于Flask的全棧數據分析平臺 本文詳細介紹了一個基于Flask框架開發的校園霸凌數據可視化分析系統&#xff0c;從技術架構到功能實現&#xff0c;為數據分析項目開發提供參考。 &#x1f4cb; 目錄 項目概述技術架構核心功能代碼結構技術棧詳解核…

Docker 網絡設置方式詳解

Docker 網絡是容器通信的核心基礎&#xff0c;它允許容器之間、容器與主機之間以及容器與外部網絡之間進行數據交互。Docker 提供了多種網絡驅動類型&#xff0c;適用于不同場景&#xff0c;下面詳細介紹 Docker 網絡的設置方式。一、Docker 網絡的基本概念 Docker 網絡通過驅動…

export default和export function的作用及export的含義

在 JavaScript 中&#xff0c;export 是一個關鍵字&#xff0c;用于將模塊中的變量、函數、類等導出&#xff0c;以便其他模塊可以導入和使用。export default 和 export&#xff08;非默認導出&#xff09;是兩種不同的導出方式&#xff0c;它們在使用場景和語義上有明顯的區別…

免費 ollama 可用地址共享 內含免費 deepseek,gpt,bge,llama,Qwen,embed 大模型等

ollama 共享 介紹 集ollama地址的批量添加&#xff0c;批量校驗&#xff0c;批量獲取 &#xff0c;api接口調用于一體 演示地址&#xff1a;ollama格式化工具 開源地址&#xff1a;https://gitee.com/web/ollama-share 使用說明 index.php 通過提交table 批量提交ollama地…

Android Audio實戰——獲取活躍音頻類型(十五)

在 Android Audio 開發中,很多場景需要獲取當前正在播放的音頻類型,而在音頻管理器 AudioManager 中并沒有發現類似的接口,這一篇文章就來看一下實現獲取活躍音頻類型的方式。 一、音頻類型獲取 對于獲取當前活躍音頻流類型,在《硬按鍵調節音量》中是通過 getActiveStream…

Verilog功能模塊--SPI主機和從機(02)--SPI主機設計思路與代碼解析

前言 上一篇文章介紹了SPI的四種工作模式及其時序特性&#xff0c;相信各位同學已經掌握了SPI通信的核心原理。 本文用純Verilog設計了功能完整的4線SPI主機&#xff0c;并詳細說明了模塊編碼思路和使用注意事項&#xff0c;最后分享了源碼。 一、模塊功能 本Verilog功能模塊—…

Decoder模型 向量模長表示什么

Decoder模型 向量模長表示什么 詞和其他詞的關系的強弱和關聯程度;生僻詞模長小 從實驗結果來看,Qwen2-7B-Instruct的向量模長規律與之前的預期(“模長與語義豐富度、確定性正相關”)完全相反,這反映了Decoder-only模型(尤其是指令微調模型)的表征特性與Encoder-only模…

STL容器及其算法

C 標準庫容器詳解&#xff1a;特性、用法與場景選型容器是 C 標準庫&#xff08;STL&#xff09;的核心組件&#xff0c;用于存儲和管理數據。不同容器因底層實現不同&#xff0c;在性能、功能和適用場景上差異顯著。本文系統梳理vector、list、set、map等常用容器&#xff0c;…

MySQL ZIP安裝教程:從解壓到啟動

金金金上線&#xff01; 話不多&#xff0c;只講你能聽懂的前端知識 前言 我這里不能下載安裝程序的mysql&#xff0c;由于電腦安全限制&#xff0c;安裝時會彈出需要管理員賬號密碼權限&#xff0c;此路行不通&#xff0c;所以琢磨著免安裝版本怎么個流程&#xff0c;好&#…

p2p打洞

p2p網絡穿透庫,它的C++版本目前只支持linux,不支持win,它最新版本的穿透用的tcp,老版本支持tcp/udp: https://libp2p.io/ P2P-udp的穿透教程: https://edu.51cto.com/lesson/731596.html 目前打洞機制最好的庫是webrtc,其次是libnice,它是輕量級的專門打洞的庫。 libni…

『“無恙心寬”,梗痛不常』——愛上古中醫(12)(健康生活是coder抒寫優質代碼的前提條件——《黃帝內經》伴讀學習紀要)

養心護心氣血通&#xff0c;無痛無梗全身松。 筆記模板由python腳本于2025-08-10 15:54:46創建&#xff0c;本篇筆記適合至少通曉一門語言&#xff0c;熟悉基本編程范式的coder翻閱。 學習的細節是歡悅的歷程 博客的核心價值&#xff1a;在于輸出思考與經驗&#xff0c;而不僅僅…

Spark 運行流程核心組件(一)作業提交

1、Job啟動流程1、Client觸發 SparkContext 初始化 2、SparkContext 向 Master 注冊應用 3、Master 調度 Worker 啟動 Executor 4、Worker 進程啟動 Executor 5、DAGScheduler 將作業分解為 Stage&#xff1a; 6、TaskScheduler 分配 Task 到 Executor 2、核心組件組件職責Spar…