0

0

深入理解 jstat -printcompilation 输出中的编译类型

聖光之護

聖光之護

发布时间:2025-08-08 15:10:01

|

564人浏览过

|

来源于php中文网

原创

深入理解 jstat -printcompilation 输出中的编译类型

本文深入探讨了 jstat -printcompilation 命令的输出,特别是 Type 列的含义。该列指示了JIT编译的类型,包括常规编译、栈上替换和本地方法编译。然而,需要注意的是,在标准JDK发布版本中,由于特定调试选项的限制,Type 列通常只显示为 1(常规编译),其他类型仅在特殊配置的调试JVM中可见。理解这一点对于准确解读JIT编译活动至关重要。

jstat -printcompilation 概述

jstat 是 jdk 提供的一个命令行工具,用于监控 jvm 的各种运行时数据。其中,jstat -printcompilation 命令专门用于显示最近一次 jit(just-in-time)编译的方法信息。这对于理解 jvm 在运行时如何优化代码非常有帮助。

该命令的典型输出格式如下:

Compiled  Size  Type Method
     207     64    1 java/lang/CharacterDataLatin1 toUpperCase
     208      5    1 java/math/BigDecimal$StringBuilderHelper getCharArray

输出中各列的含义:

  • Compiled: 已编译方法的索引或计数。
  • Size: 编译后的方法字节码大小。
  • Type: 编译类型。这是本文重点探讨的列。
  • Method: 编译的方法的全限定名。

Type 列的深层解析

Type 列的值表示了 JVM 对方法进行 JIT 编译的具体类型。根据 OpenJDK 源码中的定义,Type 列的值对应于内部的 CompileType 枚举,主要包含以下几种类型:

  1. 1 = normal_compile: 这是最常见的编译类型,表示常规的 JIT 编译。当 JVM 识别到某个方法被频繁调用,或者其热度达到阈值时,会将其编译成机器码以提高执行效率。
  2. 2 = osr_compile: 表示“栈上替换”(On-Stack Replacement)编译。当一个方法在执行过程中(即在调用栈上)被发现是热点代码时,JVM 可以对其进行编译,并用编译后的版本替换当前正在执行的解释器版本,而无需等待方法执行完毕并重新进入。这种优化通常发生在循环中。
  3. 3 = native_compile: 表示对本地(Native)方法的编译包装。本地方法(如通过 JNI 调用的 C/C++ 方法)本身不是 Java 字节码,但 JVM 可能会为其生成一个编译过的包装器,以便更好地集成到 JIT 优化流程中,例如进行参数传递优化或异常处理。

实际应用与注意事项

尽管 Type 列理论上可以显示 1、2 或 3,但在实际生产环境中,使用标准 JDK(发布版本)时,您几乎总是会看到 Type 列的值为 1。这是因为 osr_compile 和 native_compile 这两种类型的数据统计,默认情况下只在 JVM 的调试版本中启用,并且需要显式设置特定的 JVM 启动参数。

具体来说,在 OpenJDK 的实现中,Type 列的值是根据以下逻辑确定的:

  int last_compile_type = normal_compile; // 默认为 1
  if (CICountOSR && is_osr) { // 如果开启了 OSR 计数且当前是 OSR 编译
    last_compile_type = osr_compile; // 设置为 2
  } else if (CICountNative && method->is_native()) { // 如果开启了 Native 计数且是本地方法
    last_compile_type = native_compile; // 设置为 3
  }

其中,CICountOSR 和 CICountNative 是 JVM 的内部选项,它们默认在发布版本中是关闭的。要启用它们,需要使用 -XX:+CICountOSR 和 -XX:+CICountNative 这两个 JVM 参数。然而,这些参数通常只在 JVM 的调试版本中有效,并且不推荐在生产环境中使用,因为它们可能会引入额外的开销或不稳定性。

这意味着:

Python精要参考 pdf版
Python精要参考 pdf版

这本书给出了一份关于python这门优美语言的精要的参考。作者通过一个完整而清晰的入门指引将你带入python的乐园,随后在语法、类型和对象、运算符与表达式、控制流函数与函数编程、类及面向对象编程、模块和包、输入输出、执行环境等多方面给出了详尽的讲解。如果你想加入 python的世界,David M beazley的这本书可不要错过哦。 (封面是最新英文版的,中文版貌似只译到第二版)

下载
  • 在绝大多数生产环境的 JDK 部署中,jstat -printcompilation 输出的 Type 列将始终显示为 1。
  • 如果您需要观察 2 或 3 类型的编译,您需要使用 JVM 的调试版本,并配置相应的 XX 参数。这通常用于 JVM 性能分析和调试的特定场景。

如何使用 jstat -printcompilation:

首先,您需要获取目标 Java 进程的 PID(进程ID)。可以使用 jps 命令来查看正在运行的 Java 进程及其 PID:

jps -l

然后,使用获取到的 PID 执行 jstat -printcompilation 命令:

jstat -printcompilation 

例如:

jstat -printcompilation 12345

这将显示该 PID 对应的 Java 进程最近一次 JIT 编译的方法信息。持续运行此命令(例如,结合 watch 命令)可以观察到 JIT 编译的动态过程。

总结

jstat -printcompilation 是一个有用的工具,用于监控 JVM 的 JIT 编译活动。尽管 Type 列提供了编译类型的详细信息,但由于 JVM 内部选项的限制,在标准生产环境的 JDK 中,该列的值通常只显示为 1,表示常规 JIT 编译。理解这一限制对于准确解读 jstat 输出至关重要,避免对 Type 列的单一值产生误解。对于深入研究 JIT 编译行为,特别是栈上替换和本地方法编译,可能需要更专业的 JVM 调试工具和环境配置。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

832

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

738

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

734

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

397

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

398

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

446

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

430

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16926

2023.08.03

Golang gRPC 服务开发与Protobuf实战
Golang gRPC 服务开发与Protobuf实战

本专题系统讲解 Golang 在 gRPC 服务开发中的完整实践,涵盖 Protobuf 定义与代码生成、gRPC 服务端与客户端实现、流式 RPC(Unary/Server/Client/Bidirectional)、错误处理、拦截器、中间件以及与 HTTP/REST 的对接方案。通过实际案例,帮助学习者掌握 使用 Go 构建高性能、强类型、可扩展的 RPC 服务体系,适用于微服务与内部系统通信场景。

8

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 3.7万人学习

Pandas 教程
Pandas 教程

共15课时 | 0.9万人学习

ASP 教程
ASP 教程

共34课时 | 3.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号