百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

干货:MAC上轻松搞定查看Java汇编代码

ztj100 2025-02-08 13:56 11 浏览 0 评论

大家上学时是否学过汇编语言,还记得学过的汇编语言长什么样子吗?好吧,我是忘记了,只记得有0x0000000****,今天就带大家来一起看下汇编代码的真面目。

示例代码

本次我们将通过IntellJ IDEA + hsdis 插件来查看如下程序的汇编代码:

public class TestThread {
    private static volatile boolean loop_flag = false;
    public static void main(String[] args) throws InterruptedException {
        new Thread(() -> {
            System.out.println("Thread 1 is runnint ……");
            while (!loop_flag) {
            }
            System.out.println("===================");
        }).start();
        Thread.sleep(2000);
        new Thread(() -> {
            System.out.println("Thread 2 is running ……");
            loop_flag = true;
            System.out.println("Thread 2 change loop_flag ……");
        }).start();
    }
}

下载hsdis-amd64.dylib

hsdis是Java官方推荐HotSpot虚拟机JIT(即时编译器)编译代码的一个反汇编插件,下载hsdis-amd64.dylib,并拷贝到JRE的安装目录下。

  • 下载地址:https://pan.baidu.com/s/191qe6yZSYcF3x-N_a7f3ew
  • 提取码:cwg4
  • JRE目录:jdk1.8.0_181.jdk/Contents/Home/jre/lib/server

注意:hsdis-amd64.dylib的权限和所属用户要按需修改(chown、chmod),只要有可执行权限即可。

配置IntelliJ IDEA参数

点击IntelliJ IDEA中的“Edit Configureations…”,进行VM options配置,配置如下参数:

-XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -Xcomp -XX:+LogCompilation -XX:LogFile=/logs/hotspot.log

Java命令参数说明可以参考
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html

  • -XX:+UnlockDiagnosticVMOptions:解锁用于JVM诊断的选项
  • -XX:+PrintAssembly:配合反汇编插件,打印出字节码和本地方法的汇编码,必须和 -XX:+UnlockDiagnosticVMOptions一起使用
  • -Xcomp:在第一次调用时强制编译方法,默认情况下,无论是 -client 模式还是 -server 模式,都需要执行一定次数解释方法的调用才会触发方法的编译。(如果需要 JIT 日志,则不指定该参数)
  • -XX:+LogCompilation:允许将编译活动记录到当前工作目录中名为hotspot.log的文件中,可以通过-XX:LogFile来指定文件名和文件路径
  • -XX:LogFile=path:指定日志的文件名和文件路径,如:-XX:LogFile=/logs/hotspot.log

运行Java文件,查看汇编代码

运行示例JAVA代码,在IntellJ IDEA控制台就输出了汇编代码,是不是看起来有点眼熟啦。

JITWatch优雅看汇编代码

上面的输出结果,相信你看着也比较难受,这个时候JITWatch就可以大显身手了。JITWatch是由Chris Newland开发的一款HotSpot JIT编译器日志分析工具,它可以分析JVM产生的hotspot.log文件,并以可视化的方式将JIT 执行时的信息显示出来。

JITWatch安装与启动

  • clone jitwatch项目
git clone https://github.com/AdoptOpenJDK/jitwatch.git
  • cd 到 jitwatch目录下,通过Maven进行编译,编译成功后,即可打开jitwatch主界面
mvn clean compile test exec:java
  • 以后每次启动jitwatch,在jitwatch目录下直接运行启动脚本即可
sh launchUI.sh
  • JITWatch主界面

JITWatch分析hotspot.log

  • 点击“Config”按钮,设置Java源码文件、Class字节码文件路径,点击“Save”,一定要注意选择的目录层级
  • 配置完成之后,点击“Open Log”按钮,导入我们刚刚生成的日志文件,然后点击“Start”按钮,即可看到我们刚刚运行的Java类方法
  • 双击即可打开看到代码对照界面了,这样看是不是舒服很多

小结

通过查看汇编代码,你就会发现在操作volatile变量时,底层汇编语言是追加了 lock 关键词,来保证可见性和防止重排序的。Lock处理器可以独享主内存,锁住系统总线,让其他CPU不能通过总线访问系统主内存。

  0x0000000113e3b997: lock addl $0x0,(%rsp)     ;*putstatic loop_flag
                                                ; - com.luandy.wolf.TestThread::lambda$main$1@9 (line 15)
                                                ; - com.luandy.wolf.TestThread$$Lambda$2/553264065::run@0

相关推荐

利用navicat将postgresql转为mysql

导航"拿来主义"吃得亏自己动手,丰衣足食...

Navicat的详细教程「偷偷收藏」(navicatlite)

Navicat是一套快速、可靠并价格适宜的数据库管理工具,适用于三种平台:Windows、macOS及Linux。可以用来对本机或远程的MySQL、SQLServer、SQLite、...

Linux系统安装SQL Server数据库(linux安装数据库命令)

一、官方说明...

Navicat推出免费数据库管理软件Premium Lite

IT之家6月26日消息,Navicat推出一款免费的数据库管理开发工具——NavicatPremiumLite,针对入门级用户,支持基础的数据库管理和协同合作功能。▲Navicat...

Docker安装部署Oracle/Sql Server

一、Docker安装Oracle12cOracle简介...

Docker安装MS SQL Server并使用Navicat远程连接

...

Web性能的计算方式与优化方案(二)

通过前面《...

网络入侵检测系统之Suricata(十四)——匹配流程

其实规则的匹配流程和加载流程是强相关的,你如何组织规则那么就会采用该种数据结构去匹配,例如你用radixtree组织海量ip规则,那么匹配的时候也是采用bittest确定前缀节点,然后逐一左右子树...

使用deepseek写一个图片转换代码(deepnode处理图片)

写一个photoshop代码,要求:可以将文件夹里面的图片都处理成CMYK模式。软件版本:photoshop2022,然后生成的代码如下://Photoshop2022CMYK批量转换专业版脚...

AI助力AUTOCAD,生成LSP插件(ai里面cad插件怎么使用)

以下是用AI生成的,用AUTOLISP语言编写的cad插件,分享给大家:一、将单线偏移为双线;;;;;;;;;;;;;;;;;;;;;;单线变双线...

Core Audio音频基础概述(core 音乐)

1、CoreAudioCoreAudio提供了数字音频服务为iOS与OSX,它提供了一系列框架去处理音频....

BlazorUI 组件库——反馈与弹层 (1)

组件是前端的基础。组件库也是前端框架的核心中的重点。组件库中有一个重要的板块:反馈与弹层!反馈与弹层在组件形态上,与Button、Input类等嵌入界面的组件有所不同,通常以层的形式出现。本篇文章...

怎样创建一个Xcode插件(xcode如何新建一个main.c)

译者:@yohunl译者注:原文使用的是xcode6.3.2,我翻译的时候,使用的是xcode7.2.1,经过验证,本部分中说的依然是有效的.在文中你可以学习到一系列的技能,非常值得一看.这些技能不单...

让SSL/TLS协议流行起来:深度解读SSL/TLS实现1

一前言SSL/TLS协议是网络安全通信的重要基石,本系列将简单介绍SSL/TLS协议,主要关注SSL/TLS协议的安全性,特别是SSL规范的正确实现。本系列的文章大体分为3个部分:SSL/TLS协...

社交软件开发6-客户端开发-ios端开发验证登陆部分

欢迎订阅我的头条号:一点热上一节说到,Android客户端的开发,主要是编写了,如何使用Androidstudio如何创建一个Android项目,已经使用gradle来加载第三方库,并且使用了异步...

取消回复欢迎 发表评论: