使用JITWatch监控JIT状态

[img]http://zeroturnaround.com/wp-content/uploads/2014/07/head-640x366.png[/img]

性能是个很复杂的问题,尤其是当你意识到程序在编译阶段会经历多次重写的时候。首先,你的源码会被翻译成字节码,然后再被进一步编译成机器代码,有时候甚至是多次编译。

有时候你的程序运行得并不是很快。之后你就会抱怨你的平台或者工具,并且考虑用C或者什么奇怪的方式来重写系统中的关键部分。然而,在你开始这个黑暗过程之前,请先再看看:还有一些工具是能让你在享受着JVM便利的同时还把问题解决掉的。

如果充分发挥你对JVM内部以及JIT工作原理的知识,你可以优化你的程序让它执行得更快一些。但今天我们要讲的并不是这些优化本身。如果你对这些东西更感兴趣的话,可以看一个例子,”[url=https://github.com/brettwooldridge/HikariCP/wiki/Down-the-Rabbit-Hole]HikariCP是如何优化的[/url]“。我们今天要讲的是一个叫[url=https://github.com/AdoptOpenJDK/jitwatch]JITWatch[/url]的工具,你可以用它来查看JIT是如何去处理你的程序的。

[b]JITWatch初瞥[/b]

JITWatch是Java Hotspot JIT编译器的一个日志分析工具。它会读入JIT的日志文件,然后将它的活动记录可视化。这个项目最初由Chris Newland发起,后面被捐赠给了Adopt OpenJDK这个项目。

如果你想知道JVM在运行时对你的代码做了什么或者需要调整JVM参数来优化虚拟机性能的时候,它可是个无价之宝。

除此之外,它还可以让你能同步地观察到程序的源码,字节码,以及机器代码,因此你不仅能更清楚应用的性能瓶颈,同时还能避免使用javap这样乱糟糟的命令行工具。先进的工具让生活变得更轻松,在这篇文章里,我们将给一个示例项目进行JITWatch的配置,并观察它在启动期间到底发生了什么。

[b]开始JITWatch之旅[/b]

首先我们得获取下它的可执行程序。幸运的是,正如每一个有自尊心的软件一样,JITWatch也能在Github上获取到,这样前期的编译可以省掉了,我们可以直接拷贝一个。




git clone git@github.com:AdoptOpenJDK/jitwatch.git
cd jitwatch
mvn clean install -DskipTests=true
./launchUI.sh # make sure that line-endings are correct :)



完成之后,你会看到如下的漂亮的欢迎界面。

[img]http://zeroturnaround.com/wp-content/uploads/2014/07/welcomescreen-640x358.png”/>

很好,下面我们需要配置一下要研究的应用了。

[b]这是我们要进行实验的小白鼠[/b]

我们希望每篇博客都能有不止一个用途,因此很快我们就面临了这样的问题:

我们应该运行一个什么样的DEMO工程,这样它能代表大多数的Java开发的应用?

根据我们的[url=http://pages.zeroturnaround.com/Java-Tools-Technologies.html]Java工具及技术报告一文[/url]中所述,大多数人都是在进行WEB应用的开发,并且部署在Tomcat之上。 那看起来我们这个DEMO工程应该是一个WEB程序了。是的,你猜对了,它就是已使用多年的著名的Spring,我们将用它作为一个JRebel的DEMO程序来运行。

这里是它的[url=https://github.com/zeroturnaround/spring-petclinic]Github仓库地址[/url],如果你希望拷贝一份修改一下的话。幸运的是,它是自我驱动的,因此我们什么都不用改就可以运行了。




mvn tomcat:run



它会在petclinic的父目录执行,并完成所有的事情,创建一个Tomcat实例并将程序部署上去。这就是我们所想要的。


[b]调整应用[/b]


为了能生成用来分析的hotspot.log文件,我们得给我们这个示例程序的进程增加几个JVM选项。


这是JITWatch的[url=https://github.com/AdoptOpenJDK/jitwatch/wiki]WIKI页面[/url]上推荐的选项:





[*]XX:+UnlockDiagnosticVMOptions -XX:+TraceClassLoading -XX:+LogCompilation -XX:+PrintAssembly



把这些选项添加到Tomcat进程中最简单的方法就是直接增加到maven里面。执行一下 :





export "MAVEN_OPTS=$MAVEN_OPTS -XX:+UnlockDiagnosticVMOptions -XX:+TraceClassLoading -XX:+LogCompilation -XX:+PrintAssembly"



如果你的JDK警告说“PrintAssembly is disabled”,去下载一个hsdis就好了([url=http://dropzone.nfshost.com/hsdis.htm” target=“_blank”>WINDOWS[/url], <a href=]Linux[/url], <a href="http://www.nitschinger.at/Printing-JVM-generated-Assembler-on-Mac-OS-X” target=“_blank”>OSX[/url])。


[b]准备就绪,出发![/b]


只需一个mvn tomcat:run命令,我们就能看到一个hostpot_pid${pid}.log的文件,这里${pid}是JVM进程的ID,文件在petclinic工程的父目录中。


点击Config按钮将源码及类文件的路径关联起来,这样你的体验会更好一些。Add JDK src按钮会自动地将JDK源码的路径加上,因此你就点击一下就好了。


[img]http://zeroturnaround.com/wp-content/uploads/2014/07/config-640x416.png[/img]


现在开始分析吧,过一会儿JITWatch就会出结果了。


[b]一些额外的特性[/b]


从JITWatch所提供的信息你能了解到什么?首先,会有一张编译的时间轴图。看到它我知道得等个一分钟左右才能编译完基本的类:注意,我们并没有给应用添加任何负载,因此我们定义的那些类还没有开始编译。


[img]http://zeroturnaround.com/wp-content/uploads/2014/07/timeline-640x503.png[/img]

还有一个有用的东西就是最大字节码方法排行榜。方法越小,它就越有可能被JIT编译器内联。因此大的方法不只是降低了可读性,它还会带来性能的消耗。从这个视图可以看到哪些类或者方法是需要拆分的。

[img]http://zeroturnaround.com/wp-content/uploads/2014/07/largest-methods-640x208.png[/img]

当然还有TriView,通过它你能看出机器目前究竟在执行什么东西。下面是TriView的一个示例,它显示的是一个BigInteger(String, int)的构造方法正在执行的过程,三个窗口还会同步高亮显示。

[img]http://zeroturnaround.com/wp-content/uploads/2014/07/triview-marked-640x390.png[/img]

如果你感兴趣的方法还没有编译,JITWatch会提醒你,你可以给你的应用增加一些负载,或者调低一下JIT的阈值,这样编译器会认为这个方法执行的足够频繁,就会将它进行编译。

[b]结束语:使用JITWatch来更好地查看应用的性能,负载以及执行速度[/b]

我们已经简单地了解了JVM的JIT是如何将字节码编译成机器代码的了,并创建了一个示例工程来进行实验。事实上,JITWatch就是一个非常简单直接的工具,你能够直观地了解到你的Java程序正在发生些什么。

如果你希望能更流畅地阅读JVM的字节码,我推荐你看一下我们的JRebel产品的老大写的[url=http://pages.zeroturnaround.com/RebelLabs-AllReportLanders_MasteringJavaBytecodeattheCoreoftheJVM.html]这篇文章[/url]。


原创文章转载请注明出处:[url=http://it.deepinmind.com/jvm/2014/07/18/why-it-rocks-to-finally-understand-java-jit-with-jitwatch.html]http://it.deepinmind.com[/url]

[url=http://zeroturnaround.com/rebellabs/why-it-rocks-to-finally-understand-java-jit-with-jitwatch/]英文原文链接[/url]
Java性能分析工具JITWatch配置与使用 本文介绍了如何使用 JITWatch 工具来分析和优化 Java 应用的性能。JITWatch 能够帮助开发者深入了解 Java 的即时编译(JIT)过程,识别性能瓶颈。文章详细讲解了如何下载、配置和使用 JITWatch,并通过实际案例展示了如何查看字节码和汇编码,特别是 volatile 关键字的底层实现。作者还提供了相关资源和读者交流群,方便开发者进一步学习和讨论。通过本文,初学者可以快速上手 JITWatch,提升 Java 应用的性能优化能力。 阅读详情

相关推荐

Spring性能优化与JIT/AOT编译技术深度解析

在现代Java开发中,框架性能与编译器优化是提升应用效率的关键因素。Spring框架通过IoC容器和AOP机制简化了企业级开发,但同时也引入了反射和动态代理等运行时开销。JIT(即时编译)和AOT(预先编译)技术通过不同的编译策略优化执行效率,JIT在运行时动态优化热点代码,而AOT则在构建时生成原生机器码。理解这些技术的原理和适用场景,可以帮助开发者在微服务、高并发等不同业务需求下做出合理的技术选型。本文通过实际测试数据展示了Spring框架的性能影响,以及如何通过JIT和AOT技术显著提升Java应用的

chutisun0039的博客 504

JITWatch很折腾?有这篇文章在可以放心

知道了通过。

BASK2311的博客 1082

JVM动态语言性能优化实战:Nashorn引擎性能瓶颈与GraalVM优化方案

在JVM平台上运行动态语言(如JavaScript、Python)时,性能优化是开发者面临的核心挑战。动态语言的类型系统灵活性和运行时特性,使得传统的静态优化技术难以直接应用。JVM通过JIT(即时编译)技术,结合invokedynamic字节码指令,实现了对动态语言的高效支持。其核心原理在于热点代码识别、类型推断和方法内联等优化手段,这些技术能够显著提升脚本执行效率,降低运行时开销。在实际工程实践中,Nashorn作为经典的JVM内置JavaScript引擎,常面临类型不稳定、eval语句滥用等导致的性能

weixin_33755649的博客 428

JITWatch查看字节码被JIT编译后的汇编代码

最近看书看到关于volitale关键字与jmm内存模型的介绍,这个知识点似乎看了好多次,背都能背下来了。但理论性的东西真的很容易忘记,看不到摸不着。于是...

吴就业 1175

Java最长回文子串的工程化实现与JVM级优化

最长回文子串是字符串处理中的经典问题,其本质在于识别具有中心对称特性的连续字符序列。从算法原理看,中心扩展法以O(n²)时间复杂度平衡了性能与可维护性;在Java工程实践中,String不可变性、substring内存行为、JDK版本差异及Unicode代理对处理等底层机制,直接决定方案是否具备生产就绪能力。该问题的技术价值不仅在于算法选型,更在于驱动开发者深入理解JVM内存模型、HotSpot JIT优化策略与高并发安全设计。典型应用场景涵盖内容审核中的恶意词检测、金融流水异常识别、IoT日志结构校验等。

weixin_34258838的博客 396

jitwatch:Java HotSpot JIT编译器的日志分析器可视化工具。 检查内联决策,热门方法,字节码和汇编。 在JavaFX用户界面中查看结果

JITWatch HotSpot JIT编译器的日志分析器和可视化工具。 JITWatch 视频介绍 我在JITWatch 上的LJC闪电演讲中的 有关说明和屏幕截图,请参见Wiki。 JITWatch用户界面是使用JavaFX构建的。 这包含在Oracle JDK中。 如果您使用的JDK不包含JavaFX(例如Azul Zulu或Linux上的某种打包的OpenJDK),则可以从下载预构建的OpenJFX jar,并将其放入构建类路径中。 蚂蚁 ant clean compile test run 专家 mvn clean compile test exec:java 摇动 gradl

JIT的Profile神器JITWatch

简介 老是使用命令行工具在现代化社会好像已经跟不上节奏了,尤其是在做JIT分析时,使用LogCompilation输出的日志实在是太大了,让人望而生畏。有没有什么更加简便的方法来分析JIT日志呢?快来和小师妹一起来学习JITWatch吧。 什么是JIT 小师妹,F师兄,JIT就是Just In Time compilers。能不能再总结一下JIT到底是做什么的呢? 当然没问题,JIT主要有两个作用,第一个作用大家应该已经知道了,就是在运行时将byte code编译成为机器码,提高程序的执行速度。 第二个作用

程序那些事 1万+

保姆级教程:在Ubuntu 20.04上搞定PX4飞控与T265的视觉定位(附避坑指南)

本文提供在Ubuntu 20.04上配置PX4飞控与T265视觉定位系统的详细教程,涵盖驱动安装、ROS与MAVROS桥接、PX4参数调优及故障排查。通过实测验证的步骤和避坑指南,帮助开发者实现厘米级精度的视觉定位,特别适合室内无人机应用。

weixin_29038155的博客 251

Java JIT 优化日志分析

通过添加`-XX:+PrintCompilation`、`-XX:+UnlockDiagnosticVMOptions`等参数,可以记录方法编译、内联和去优化等关键事件。日志中出现的`made not entrant`或`made zombie`等条目,表明优化被回退。结合`-XX:+LogCompilation`生成的详细日志,还能进一步观察内联决策和循环优化效果。掌握这些方法,开发者不仅能解决即时性能问题,还能积累优化经验,为高并发、低延迟应用打下坚实基础。JIT日志的生成与配置。

vyqmqq_108的博客 192

CMU开源NavRL:深度强化学习如何破解无人机动态避障难题?

卡内基梅隆大学(CMU)开源了NavRL框架,利用深度强化学习解决无人机在复杂环境中的动态避障难题。该框架通过创新的状态表示、多目标奖励函数设计以及独立的安全屏障机制,使无人机能够通过仿真训练自主学会灵活、安全的导航策略,并成功实现从仿真到真实环境的零样本迁移。

hope8的博客 720

实战解析:利用Python requests库高效抓取京东商品评论并构建结构化数据集

本文详细介绍了如何利用Python requests库高效抓取京东商品评论并构建结构化数据集。通过分析京东评论接口、处理反爬机制以及数据解析存储,帮助开发者快速获取电商数据,适用于竞品监控、用户画像构建等商业场景。

weixin_42526415的博客 838

深入解析 JVM 性能优化:JIT、逃逸分析与编译阈值的协同机制

JIT 即时编译(Just-in-time Compilation,JIT)是一种通过在运行时将字节码翻译为机器码,从而改善字节码编译语言性能的技术。在HotSpot实现中有多种选择:C1、C2和C1+C2,分别对应client、server和分层编译。 1、C1编译速度快,优化方式比较保守; 2、C2编译速度慢,优化方式比较激进; 3、C1+C2在开始阶段采用C1编译,当代码运行到一定热度之后...

ywl470812087的博客 9万+

在MATLAB产生正态(Gauss)分布随机数

在 MATLAB 中内置了有产生标准正态(Gauss)分布的随机数函数,使用方法如下: 其中 为产生矩阵的行数和列数, 为产生矩阵的个数,产生的矩阵中的每个元素均为服从 N(0,1)N(0, 1)N(0,1) 的标准正态分布的元素。使用如下命令产生一个 的服从的随机数矩阵: 绘制图像效果如下: 可以看到这里随机数服从 的标准正态分布。假设 X∼N(0,1)X\sim N(0,1)X∼N(0,1),则 3X+33X+33X+3 服从 N(3,9)N(3,9)N(3,9) 分布,因此我们要产生服从 N(

程序必须为人类阅读而编写,并且仅仅碰巧可以让机器执行 3万+

JVM调优-工具

一、JDK内置工具 1.监控工具 jps jstat 2.故障排除工具 jinfo jmap jstack jcmd jhat jhsdb 3.可视化工具 jhsdb jconsole visualvm java mission control 二、第三方工具 memo...

IT蜗牛的专栏 4348

【ArcPy】用Python批量处理大规模地理数据的几何校正

在许多GIS应用中,尤其是在大规模地理数据处理时,几何校正(Geometric Correction)是一个至关重要的任务。它确保了不同来源的地理数据能够正确地对齐和匹配,从而为后续分析提供准确的基础。几何校正的常见应用包括遥感影像的地理配准、矢量数据的投影转换等。几何校正通常包括坐标转换、重采样等步骤。以下示例展示了如何使用arcpy的工具进行几何校正。"""实施几何校正:param input_layer: 输入待校正数据层。

陈书予 1002

京东/淘宝商品评论情感分析:基于Python的大规模评论爬取与NLP情感分析实战

在当今电商蓬勃发展的时代,用户评论已成为影响消费者购买决策的关键因素。本文将详细介绍如何使用Python最新技术栈爬取京东和淘宝商品评论,并运用先进的自然语言处理技术对评论进行情感分析,识别用户的好评与差评倾向。通过完整的代码实现和深入的技术解析,帮助读者掌握从数据采集到情感分析的全流程。本文详细介绍了如何使用Python最新技术栈实现京东和淘宝商品评论的爬取与情感分析。通过结合异步爬虫、反爬策略、BERT情感分析等先进技术,我们构建了一个完整的评论分析系统。高效爬取。

2201_76125261的博客 1404

JVM动态语言性能优化:Nashorn引擎实战与调优指南

在Java虚拟机(JVM)生态中,即时编译(JIT)优化是提升应用性能的核心机制,它通过运行时分析代码执行模式,将热点代码编译为高效本地指令。然而,当在JVM上运行动态语言如JavaScript时,其动态类型特性与JVM的静态优化模型会产生显著冲突,导致频繁的去优化(Deoptimization)事件,严重影响执行效率。这一技术挑战在需要高灵活性的场景如插件化系统、动态配置解析中尤为突出。以Nashorn引擎为例,其作为Java 8至14的官方JavaScript实现,常因类型震荡和高频跨语言调用引发性能瓶

weixin_30376083的博客 328

SpringBoot系列之实现一个AI聊天助手

本文介绍了基于Spring Boot框架实现的AI聊天助手项目。该项目使用Spring Boot 3.2.3、Spring AI 1.0.0-M5等技术栈,集成DeepSeek-R1-Distill-Llama-8B模型实现智能对话功能。文章详细介绍了项目配置流程、运行方式和核心代码实现,包括ChatMessage模型类和服务类ChatService的关键功能,如消息处理、历史记录管理和AI响应获取等。读者可通过提供的GitHub链接获取完整代码,快速搭建自己的AI聊天应用。

Nicky's blog 1452

Nashorn性能实战:JVM上JavaScript引擎的调优与排查指南

在JVM生态中,动态脚本执行是常见的需求,它允许应用在运行时灵活执行业务逻辑。其核心原理是通过脚本引擎将动态语言代码转换为JVM字节码,再借助JIT编译器优化为本地机器码,以实现高性能。这项技术的价值在于为规则引擎、动态配置、模板渲染等场景提供了强大的扩展能力。然而,动态类型的特性与JVM的静态优化模型之间存在固有张力,常引发性能瓶颈。本文聚焦于Nashorn引擎,深入剖析其性能实战中的关键挑战,特别是围绕JVM热身机制和类型推断优化展开。通过具体的性能排查链路与调优策略,帮助开发者在生产环境中实现脚本执行

weixin_34416649的博客 378

基于STM32、HAL库、I2C接口的姿态传感器/陀螺仪之ICM-42670-P驱动 C语言程序设计

/ 设置加速度计和陀螺仪的工作模式。// 读取加速度计和陀螺仪数据。

corlin6688的博客 1181

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

2026大厂Java面试真相:故障驱动的工程化复习法

Java面试已从知识记忆转向工程问题解决能力考察,核心是理解技术在真实系统中的行为边界与失效表现。基于JVM内存模型、并发原语、网络协议栈和框架生命周期等基础概念,面试官通过生产故障(如Netty DirectBuffer泄漏、Redis脑裂、OkHttp连接池半开)检验候选人能否构建跨层因果链。其技术价值在于培养可迁移的系统诊断思维——从现象定位到根因归因,再到量化验证。典型应用场景包括线上性能压测、Arthas动态追踪、JVM参数沙盒实验及字节码级优化分析。本文聚焦‘故障驱动复习法’,融合JVM调优、S

weixin_33859844的博客 330

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

JVM逃逸分析:原理、优化与实战性能提升指南

在Java虚拟机(JVM)性能优化领域,垃圾回收(GC)是影响应用性能的关键因素之一。其核心原理在于JVM通过运行时分析对象的作用域,判断对象是否“逃逸”出当前方法或线程。基于这一分析,JVM可以实施栈上分配、标量替换和同步消除等优化技术,其技术价值在于能显著减少不必要的堆内存分配,从而降低GC频率与停顿时间,提升程序吞吐量。这一优化在高并发、实时计算等对延迟敏感的应用场景中尤为重要。本文将以JVM调优和逃逸分析为核心,通过具体案例解析如何利用此技术优化代码,解决因大量临时对象创建导致的性能毛刺问题。

weixin_30307921的博客 548

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Mirah性能优化终极指南:让你的代码运行如Java般快速 [特殊字符]

**Mirah**是一门静态类型的JVM编程语言,拥有Ruby风格的优雅语法,却能编译出与Java性能相当的字节码。如果你正在寻找一种既保持开发效率又不牺牲运行性能的语言,Mirah绝对是你的理想选择。本文将为你揭示7个Mirah性能优化的核心技巧,帮助你的代码达到Java级别的执行速度。 ## 🔍 为什么Mirah能实现Java级别的性能? Mirah的设计哲学决定了它的高性能特性: 1

gitblog_00204的博客 456

JVM逃逸分析实战:优化内存分配与GC性能的核心技术

在Java虚拟机(JVM)性能优化领域,内存分配与垃圾回收(GC)是影响应用吞吐量和延迟的关键因素。JVM通过即时编译器(JIT)在运行时对代码进行深度分析,其中逃逸分析(Escape Analysis)是一项核心技术,它能够判断对象的作用域是否仅限于当前方法或线程。基于此分析,JVM可以实施栈上分配、标量替换和同步消除等优化,从而显著减少堆内存分配压力、降低GC频率,并消除不必要的同步开销。这项技术尤其适用于大量创建短生命周期临时对象的场景,例如高并发微服务接口中的DTO转换或批量数据处理任务。通过理解逃

weixin_33827731的博客 360

Java面试真题背后的思维链路:从原理到生产落地

Java面试考察的从来不只是API用法或源码细节,而是对核心机制的理解深度与工程化落地能力。以String不可变性为例,它不仅是final修饰的结果,更涉及字节码常量池、JVM内存模型与线程安全设计的协同;HashMap的树化阈值8,则源于泊松分布在哈希碰撞场景下的概率工程学推演。这些知识点串联起编译原理、操作系统缓存、CPU指令屏障和GC调优等底层逻辑,最终服务于高并发、低延迟的真实系统——如电商订单统计、物流轨迹遍历、风控实时流处理等典型场景。掌握这种‘原理→权衡→变形→验证’的思考路径,才能在面试中超

weixin_34067102的博客 464
上一篇: 一个优秀的程序员是如何炼成的
下一篇: 4个代码生成库的性能比较
spidercoco
博客等级 码龄18年 47粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值