当前位置: 首页 > news >正文

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.dtcms.com/a/329816.html

相关文章:

  • 操作系统八股题
  • Mysql——如何做到Redolog崩溃后恢复的
  • “PDA采集→WMS智慧化分析→AGV执行”全链路管理的仓储系统
  • Qwen大模型加载与文本生成关键参数详解
  • I2c、SPI、USB驱动架构类比
  • Torch -- 卷积学习day1 -- 卷积层,池化层
  • 第四十四天:动态规划part11(第九章)
  • 存量竞争下的破局之道:品牌与IP的双引擎策略|创客匠人
  • scrapy 爬虫
  • sqli-libs通关教程(51-65)
  • YOLOv11+TensorRT部署实战:从训练到超高速推理的全流程
  • 【后端】Spring框架控制反转(IoC)与依赖注入(DI)解析
  • 从零用 NumPy 实现单层 Transformer 解码器(Decoder-Only)
  • 《红黑树驱动的Map/Set实现:C++高效关联容器全解析》
  • 基于微信小程序的生态农产销售管理的设计与实现/基于C#的生态农产销售系统的设计与实现、基于asp.net的农产销售系统的设计与实现
  • Ubuntu24.04桌面版安装wps
  • 深入分析Linux文件系统核心原理架构与实现机制
  • RS485转profinet网关接M8-11 系列 RFID 读卡模块实现读取卡号输出
  • 元数据与反射:揭开程序的“自我认知”能力
  • 【递归、搜索与回溯算法】穷举、暴搜、深搜、回溯、剪枝
  • 第七章:OLED温湿度显示系统
  • 数据库连接池如何进行空闲管理
  • 光伏板横铺VS竖铺,布局决定发电量!
  • MySQL数据库知识体系总结 20250813
  • iOS混淆工具有哪些?数据安全与隐私合规下的防护实践
  • [ai]垂直agent|意图识别|槽位提取
  • 基于Tensorflow2.15的图像分类系统
  • MySQL三大存储引擎对比:InnoDB vs MyISAM vs MEMORY
  • 【Unity3D】Spine黑线(预乘问题)、贴图边缘裁剪问题
  • Effective C++ 条款39:明智而审慎地使用private继承