Mac使用hsdis查看java字节码的汇编命令

查看Java的汇编指令 通过javap 命令,可以将字节码文件反编译。如通过下面的命令: javap -c Xxxx.class 而有时候想看某些JDK底层实现,发现反编译得到的代码并没有什么帮助,因此本文介绍如何查看Java的汇编指令,查看Java代码最真实的运行细节。 Java本身提供这个支持,但需要引入而外的包(hsdis-amd64.dylib)。 Mac下: https://github.com/... 阅读详情

前言

在《Java并发编程的艺术》这本书的第2.1章节提到了了volatile关键字会产生Lock锁前缀。比较好奇读会不会产生Lock锁前缀,如果对读不加Lock锁前缀,那么会不会在并发时出现对变量产生了部分写,然后读到部分读产生脏读?

先说结论,从汇编命令来看对volatile变量的读不会产生Lock前缀锁,可能是因为如果加了Lock前缀锁就说明该线程对该部分内存独占了,如果想独占需要等读先完成才能独占。

下面我们来看看这具体的汇编命令。

使用hsdis查看汇编命令

安装hsdis插件

hg clone http://hg.openjdk.java.net/jdk8u/jdk8u

cd jdk8u

sh get_source.sh

cd hotspot/src/share/tools/hsdis/

wget http://ftp.heanet.ie/mirrors/ftp.gnu.org/gnu/binutils/binutils-2.30.tar.gz

tar -xzf binutils-2.30.tar.gz

make BINUTILS=binutils-2.30 ARCH=amd64

#java8
sudo cp build/macosx-amd64/hsdis-amd64.dylib /Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/server/

#java9 onwards
sudo cp build/macosx-amd64/hsdis-amd64.dylib /Library/Java/JavaVirtualMachines/jdk-9.0.4.jdk/Contents/Home/lib/server/

idea配置

配置好JVM参数

-Xcomp
-XX:+UnlockDiagnosticVMOptions
-XX:+PrintAssembly
-XX:CompileCommand=compileonly,*VolatileTest.main*

下面的解释来自《深入理解Java虚拟机 JVM高级特性与最佳实践》

  • -XX:+UnlockDiagnosticVMOptions:让虚拟机进入诊断模式
  • -XX:+PrintAssembly:打印即时编译后的二进制信息(需要开启UnlockDiagnosticVMOptions)。(就是打印汇编命令了)
  • -XX:CompileCommand=compileonly,*VolatileTest.main*:筛选出自己编写的代码

查看

package com.study.jmm;

public class VolatileTest {

    private volatile static boolean flag = false;

    public static void main(String[] args) {
        long i = 0L;
        flag = true;
        while (!flag) {
            i++;
        }
        System.out.println("count = " + i);
        flag = true;
    }
}

汇编命令:

  0x000000010f7c233b: lock addl $0x0,(%rsp)     ;*putstatic flag
                                                ; - com.study.jmm.VolatileTest::main@3 (line 9)

  0x000000010f7c2340: movzbl 0x68(%r10),%r11d   ;*getstatic flag
                                                ; - com.study.jmm.VolatileTest::main@6 (line 10)

  0x000000010f7c2ad7: lock addl $0x0,(%rsp)     ;*putstatic flag
                                                ; - com.study.jmm.VolatileTest::main@45 (line 14)

可以看到只有写才会加上lock addl。

 

hsdis工具,hotspot虚拟机插件,反汇编jit编译代码 编译好的dll文件,hotspot虚拟机插件,反汇编jit编译代码 立即下载

相关推荐

hsdis-i368.dll

Windows下,帮助JVM打印JIT产生的汇编指令的辅助性dll,这是x86的版本。

Java获取汇编代码 | hsdis的基本使用

在Java虚拟机当中,当虚拟机发现某个方法或代码块的运行特别频繁,就会把这些代码认定为**“热点代码”** ,为了提高热点代码的执行销量,在运行时,虚拟机回把这些代码殡仪为本地机器码,并以各种手段尽可能地进行代码优化,运行时完成这个任务的后端编译器被称为。

iGD_Hz的博客 727

车辆横向控制MPC实战:从‘老王模型’到CasADi求解的保姆级避坑指南

本文详细解析了车辆横向控制MPC的实战应用,从经典动力学模型选择到CasADi求解器的优化配置,提供了一套完整的避坑指南。重点介绍了车辆动力学模型的验证要点、CasADi环境的高效配置技巧以及MPC问题建模的核心要素,帮助开发者快速实现稳健的横向控制方案。

weixin_42524499的博客 346

JVM执行篇:使用HSDIS插件分析JVM代码执行细节

在《Java虚拟机规范》之中,详细描述了虚拟机指令集中每条指令的执行过程、执行前后对操作数栈、对局部变量表的影响等细节。这些细节描述与Sun的早期虚拟机(Sun Classic VM)高度吻合,但随着技术的发展,高性能虚拟机真正的细节实现方式已经渐渐与虚拟机规范所描述产生越来越大的差距,虚拟机规范中的描述逐渐成了虚拟机实现的“概念模型”——即实现只能保证规范描述等效。\基于上面的原因,我们分析程序...

cpongo5 362

结构力学程序算法理论基础(一)————虚功原理

1.约束 定义约束:限制质点或者质点系运动的条件称为约束,表示这些限制条件的数学方程称为约束方程。 (1)几何约束 限制质点或者质点系在空间的几何位置的条件称为几何约束.如单摆,其中质点M可绕固定点O在平面Oxy内摆动,摆长为l.这时摆杆对质点的限制条件是:质点M必须在以点O为圆心,以l为半径的圆周上运动.其约束方程为: 又质点M在固定的曲面上运动,那么曲面方程就是质点M的约束方程,即 上...

l93919861的博客 4510

戴尔G3/AWCC用户必看:揪出WMI Provider Host疯狂占用的元凶,附5.4.35旧版回退保姆级教程

本文针对戴尔G3/AWCC用户遇到的WMI Provider Host异常占用问题,提供了详细的诊断方法和解决方案。通过分析AWCC 5.5.14.0版本的资源占用问题,指导用户回退到稳定版AWCC 5.4.35,并附上保姆级教程和预防措施,帮助用户彻底解决系统卡顿问题。

weixin_30892037的博客 561

开源探秘:hsdis,深入Java底层的钥匙

开源探秘:hsdis,深入Java底层的钥匙 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在Java开发的世界里,当我们谈论到深入理解程序的运行机制时,hsdis项目宛如一座桥梁,连接了高级语言与底层机器码之间的鸿沟。hsdis,这个从OpenJDK中提取的热点代码反汇编器,让开发者能够一窥Java字节码背后的真实世界,为性能优化和故障排查提供了强大工具。 项目技术...

gitblog_00083的博客 603

DVWA靶场实战:手把手教你绕过文件上传限制,用蚁剑连接一句话木马

本文详细介绍了在DVWA靶场中如何绕过文件上传限制并利用蚁剑连接一句话木马的实战技巧。通过分析文件上传漏洞原理、创建一句话木马、使用Burp Suite拦截修改请求以及配置蚁剑连接WebShell的全过程,帮助安全研究人员深入理解Web安全防护与攻击技术。

weixin_30335575的博客 90

JDK的命令行工具——JIT生成代码反汇编(HSDIS)。

HSDIS是一个Sun官方推荐的HotSpot虚拟机JIT编译代码的反汇编插件,他包含在HotSpot虚拟机的源码之中,但没有提供编译后的程序。在Project Kenai的网站也可以下载到单独的源码。他的作用是让HotSpot的-XX : +PrintAssembly指令调用他来把动态生成的本地代码还原为汇编代码输出,同时还生成了大量非常有价值的注释,这样我们就可以通过输出的代码...

孤芳不自赏 3580

addr2line解析不出来行号的解决方式(汇编解析高阶版)

摘要:本文针对AEC crash问题中addr2line无法解析行号的情况,通过llvm-addr2line和反汇编分析,定位到CamX::AECBEStats17::AdjustROIParams函数中的乘法溢出问题。关键发现包括: 常规addr2line只能解析到函数名但无具体行号 llvm-addr2line解析出多个可能溢出点(行196/204/211/218/270/271) 反汇编显示6个条件分支跳转到溢出处理函数 源码分析确认这些位置均存在乘法运算 最终通过汇编级调试工具成功定位UBsan报告

168

MaxScript批量修改材质、贴图名称

MaxScript批量修改材质、贴图名称1 实现效果1.1 修改前材质、贴图名称1.2 修改后2 代码 1 实现效果 1.1 修改前材质、贴图名称 1.2 修改后 2 代码 prefixName = "prefiname" maxFile = "maxfilepath" makeDir "newBitmappath" mapsPath = newbitmappath + "\\" fn formatStr index = ( str = index as string newS

郑德帅 3240

java-汇编指令

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33704591的博客 318

Android实现自动输入文本效果 (附完整源码)

Android实现自动输入文本效果 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 413

mac上使用hsdis查看java生成反汇编代码

mac上使用hsdis查看java生成反汇编代码

寂夜了无痕的博客 971

《UDS协议从入门到精通》系列——图解0x14:清除诊断信息

图解0x14:清除诊断信息,简洁易懂,迅速上手!

车载系统攻城狮 4821

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

java汇编指令查看工具jitwatch

当前环境:jdk1.8,win10,64位 打印Java汇编指令 使用hsdis工具打印汇编指令,可以自行编译或者下载已编译好的dll或so文件,并将文件拷贝至jdk安装目录下的bin/server或者bin/client,例如:D:\Program Files\Java\jdk1.8.0_131\bin\server\hsdis-amd64.dll windows下编译教程:https://dr...

阿呆的专栏 1855

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

java中的汇编指令_查看Java的汇编指令

通过javap 命令,可以将字节码文件反编译。如通过下面的命令:javap -c Xxxx.class而有时候想看某些JDK底层实现,发现反编译得到的代码并没有什么帮助,因此本文介绍如何查看Java的汇编指令,查看Java代码最真实的运行细节。Java本身提供这个支持,但需要引入而外的包(hsdis-amd64.dylib)。Mac下:https://github.com/evolvedmicro...

weixin_35990295的博客 552

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java反汇编工具hsdis-jitwatch使用

原文链接 hsdis && jitwatch hsdis是java反汇编工具,可查看java汇编实现 jitwatch不仅能够看到汇编实现,并且有UI界面版本可以切换汇编语言、查看字节码… hsdis 环境搭建 首先下载hsdis代码,本仓库就有源码,也可以自己下载源码: # 下载openjdk代码.默认master分支 git clone https://github.com/openjdk/jdk.git #进入hsdis源码目录 cd jdk/src/utils/hsdis #

少谈些主义,多研究些问题!@胡适 1290

mac下配置PrintAssembly

有时候难免想看下对应的Java代码JIT编译之后的汇编代码是什么样有了printAssembly方式,咱们相当于可以查看JIT下class对应的执行的汇编指令。所以我们可以看看加了volatile的变量执行方式上具体有什么差异,相关内容已更新到这篇文章,欢迎不吝赐教。

liangsheng_g的专栏 1523

JIT生成代码反汇编(HSDIS)

一、背景 我们知道,通过javap命令可以查看字节码信息,我们通过字节码可以知道对于一个程序,虚拟机做了些什么事情。但是各大虚拟机厂商对其的实现细节可能会大不相同,字节码只能从语义上解释程序的执行。如果我们要分析程序在宿主环境中到底是如何运行的,字节码则不能给我们提供足够详细的信息了,这个时候我们就需要站在汇编的角度考虑问题。 二、HSDIS HSDIS是sun推荐的HotSpot虚拟机J...

黄智霖的博客 1万+

利用hsdis和JITWatch查看分析HotSpot JIT compiler生成的汇编代码

  安装hsdis 要查看JIT生成的汇编代码,要先装一个反汇编器:hsdis。从名字来看,即HotSpot disassembler。 实际就是一个动态链接库。网络上有已经编绎好的文件,直接下载即可。 国内的:http://hllvm.group.iteye.com/ 也可以自己编绎,只是编绎hsdis,还是比较快的。 参考这里:http://www.chrisnewland.com...

横云断岭的专栏 1万+

使用JVM的HSDIS插件

在Windows下: 下载编译好的 hsdis-amd64.dll (优快云上);或者自己编译(https://blog.youkuaiyun.com/yizishou/article/details/53423409) 把编译好的 hsdis-amd64.dll放在 $JAVA_HOME/jre/bin/server 目录下。 在控制台运行如下代码即可: /** * java -XX:+Unl...

VimGuy的博客 7269

自己动手编译hsdis

HSDIS 是hotspot 的一个工具,用于能够da yin

沧海一粟 4661

Mac配置Hsdis输出java汇编代码

文章目录一.下载hsdis-amd64.dylib文件二.配置hsdis三.jvm配置四.执行验证成果 一.下载hsdis-amd64.dylib文件 链接: https://pan.baidu.com/s/1QHhnJpHNDal56QLbDZIYAQ 提取码: 2xa9 二.配置hsdis 放入jre/lib下 ⁨JavaVirtualMachines⁩ ▸ ⁨jdk1.8.0_201.jdk...

菜鸟腾飞 798
上一篇: 绝了,GitHub上爆火的,阿里技术专家把SpringCloudAlibaba讲通俗易懂
下一篇: JVM之线程资源标记ResourceMark
Java_ttcd
博客等级 码龄4年 198粉丝 190原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值