小师妹学JVM之:JIT中的PrintAssembly
简介
想不想了解JVM最最底层的运行机制?想不想从本质上理解java代码的执行过程?想不想对你的代码进行进一步的优化和性能提升?
如果你的回答是yes。那么这篇文章非常适合你,因为本文将会站在离机器码最近的地方来观看JVM的运行原理:Assembly。
使用PrintAssembly
小师妹:F师兄,上次你给我介绍了java中的字节码,还有JIT中的LogCompilation和PrintCompilation的用法。虽然都非常有用,但是能不能更进一步,让我能以机器的眼光来看待JVM的执行?
小师妹,如果要探究JVM的运行本质,那就应该是机器码了。难道你要去读懂机器码?虽然我不是机器码的专家,但我猜那应该是个非常复杂的过程。
小师妹:F师兄,当然不是机器码,有没有比机器码更高级一点点的,我记得上大学的时候学过汇编语言,好像就是离机器码最近的语言了,JVM有没有相应的汇编语言呢?
必须有的,我们可以使用-XX:+PrintAssembly来将assembly打印出来。
但是打印assembly是有条件的,它就像一个高傲的姑娘,不是你想追求就能追求得上的。
我们使用下面的命令来查看系统对PrintAssembly的支持程度:
java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -version
Java HotSpot(TM) 64-Bit Server VM warning: PrintAssembly is enabled; turning on DebugNonSafepoints to gain additional output
Could not load hsdis-amd64.dylib; library not loadable; PrintAssembly is disabled
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
根据大家的运行环境的不同,得到的结果可能也是不同的,我是mac的系统,从上面的结果可以看到,在我的JDK8的环境中,显示缺少hsdis-amd64.dylib,所以PrintAssembly其实是禁用的。
小师妹:F师兄,那现在咋办呀?没有hsdis-amd64.dylib就用不了PrintAssembly了。
巴甫洛夫说过:问号是开启任何一门科学的钥匙。没有问题我们就创造问题,没有困难我们就制造困难,没有hsdis-amd64.dylib当然是安装咯。
具体怎么安装,大家自行探索吧,网上有很多安装的教程,这里就不一一介绍了。
这里想讨论一个很奇怪的事情,虽然在JDK8环境中,我们不能使用PrintAssembly,因为没有hsdis-amd64.dylib。但是当我切到最新的JDK14环境中,一切都很美好,PrintAssembly可以正常运行了。
如果我们在JDK14中同样运行上面的命令,我们会得到下面的结果:

上图说明JDK14中虽然可以正常运行但是结果却不是assembly code,说明在JDK14中还是需要安装hsdis-amd64.dylib才能够得到正确的assembly结果。
注意,JDK14也需要安装hsdis-amd64.dylib才能正确使用。
输出过滤
默认情况下,PrintAssembly输出的是所有的信息,但是JDK内部的代码我们不可能进行修改,一般来说并不关心他们的assembly输出,如果要指定我们自己编写的方法,可以使用CompileCommand:
CompileCommand=print,*MyClass.myMethod prints assembly for just one method
CompileCommand=option,*MyClass.myMethod,PrintOptoAssembly (debug build only) produces the old print command output
CompileCommand=option,*MyClass.myMethod,PrintNMethods produces method dumps
例如:
-XX:CompileCommand=print,com.flydean.PrintAssemblyUsage::testPrintAssembly
这样我们可以得到,只属于testPrintAssembly方法的输出:

总结
本文讲解了怎么使用PrintAssembly来输出JVM的汇编日志。我们会在后面继续讲解这些Assembly code到底有什么用。
本文的例子https://github.com/ddean2009/learn-java-base-9-to-20
本文作者:flydean程序那些事
本文链接:http://www.flydean.com/jvm-jit-printassembly/
本文来源:flydean的博客
欢迎关注我的公众号:程序那些事,更多精彩等着您!
小师妹学JVM之:JIT中的PrintAssembly的更多相关文章
- 小师妹学JVM之:JIT中的PrintAssembly续集
目录 简介 JDK8和JDK14中的PrintAssembly JDK8中使用Assembly JDK14中的Assembly 在JMH中使用Assembly 总结 简介 上篇文章和小师妹一起介绍了P ...
- 小师妹学JVM之:JIT中的LogCompilation
目录 简介 LogCompilation简介 LogCompilation的使用 解析LogCompilation文件 总结 简介 我们知道在JVM中为了加快编译速度,引入了JIT即时编译的功能.那么 ...
- 小师妹学JVM之:JIT中的PrintCompilation
目录 简介 PrintCompilation 分析PrintCompilation的结果 总结 简介 上篇文章我们讲到了JIT中的LogCompilation,将编译的日志都收集起来,存到日志文件里面 ...
- 小师妹学JVM之:JDK14中JVM的性能优化
目录 简介 String压缩 分层编译(Tiered Compilation) Code Cache分层 新的JIT编译器Graal 前置编译 压缩对象指针 Zero-Based 压缩指针 Escap ...
- 小师妹学JVM之:深入理解JIT和编译优化-你看不懂系列
目录 简介 JIT编译器 Tiered Compilation分层编译 OSR(On-Stack Replacement) Deoptimization 常见的编译优化举例 Inlining内联 Br ...
- 小师妹学JVM之:JVM中的Safepoints
目录 简介 GC的垃圾回收器 分代回收器中的问题 safepoints safepoint一般用在什么地方 总结 简介 java程序员都听说过GC,大家也都知道GC的目的是扫描堆空间,然后将那些标记为 ...
- 小师妹学JVM之:cache line对代码性能的影响
目录 简介 一个奇怪的现象 两个问题的答案 CPU cache line inc 和 add 总结 简介 读万卷书不如行万里路,讲了这么多assembly和JVM的原理与优化,今天我们来点不一样的实战 ...
- 小师妹学JVM之:JVM的架构和执行过程
目录 简介 JVM是一种标准 java程序的执行顺序 JVM的架构 类加载系统 运行时数据区域 执行引擎 总结 简介 JVM也叫Java Virtual Machine,它是java程序运行的基础,负 ...
- 小师妹学JavaIO之:NIO中那些奇怪的Buffer
目录 简介 Buffer的分类 Big Endian 和 Little Endian aligned内存对齐 总结 简介 妖魔鬼怪快快显形,今天F师兄帮助小师妹来斩妖除魔啦,什么BufferB,Buf ...
随机推荐
- 【Flutter组件终结篇】332个组件 658页PDF
老孟导读:历时1年的时间,整理完成了330+组件的详细用法,不仅包含UI组件,还包含了功能性的组件. 虽然整理了 330+的组件基本用法,但并不是让你每一个都学习一遍,任何技术基本都是掌握 20%就可 ...
- Java实现 LeetCode 546 移除盒子(递归,vivo秋招)
546. 移除盒子 给出一些不同颜色的盒子,盒子的颜色由数字表示,即不同的数字表示不同的颜色. 你将经过若干轮操作去去掉盒子,直到所有的盒子都去掉为止.每一轮你可以移除具有相同颜色的连续 k 个盒子( ...
- Java实现 蓝桥杯 一步之遥
一步之遥 从昏迷中醒来,小明发现自己被关在X星球的废矿车里. 矿车停在平直的废弃的轨道上. 他的面前是两个按钮,分别写着"F"和"B". 小明突然记起来,这两个 ...
- Java实现 蓝桥杯VIP 算法提高 产生数
算法提高 产生数 时间限制:1.0s 内存限制:256.0MB 问题描述 给出一个整数 n(n<10^30) 和 k 个变换规则(k<=15). 规则: 一位数可变换成另一个一位数: 规则 ...
- 第七届蓝桥杯JavaA组省赛真题
解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.煤球数量 煤球数目 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第 ...
- PAT 锤子剪刀布
大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示: 现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方分别出什么手势的胜算最大. 输入格式: 输入第 1 行给出正整数 ...
- 【图机器学习】cs224w Lecture 16 - 图神经网络的局限性
目录 Capturing Graph Structure Graph Isomorphism Network Vulnerability to Noise 转自本人:https://blog.csdn ...
- TCP协议“三次握手”与“四次挥手”详解(下)
前面进行“三次握手”建立连接后,当客户端的数据发送完毕,它就会要求与服务器端断开连接,那么就要进行“四次挥手”进行连接的释放. 注意,此处所谓的“客户端”与“服务器端”,只是为了方便标识连接的双方,即 ...
- vue对象数组数据变化,页面不渲染
很多时候,我们习惯于这样操作数组和对象: data() { // data数据 return { arr: [1,2,3], obj:{ a: 1, b: 2 } }; }, // 数据更新 数组视图 ...
- 手把手教你用redis实现一个简单的mq消息队列(java)
众所周知,消息队列是应用系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构.目前使用较多的消息队列有 ActiveMQ,RabbitMQ,Zero ...