专栏首页Linux内核及编程语言底层相关技术研究居然还有方式可以查看Java方法的汇编代码,真是神奇。

居然还有方式可以查看Java方法的汇编代码,真是神奇。

当我们在研究java的内部实现时,经常会需要查看java方法的字节码,有时为了确定一些问题,甚至还需要查看某些方法在jit编译后的汇编代码。

这篇文章我们从零开始,详细说一下如何查看java方法的字节码以及汇编代码,希望能给有这方面困惑的同学提供一些帮助。

为了真正意义上的从零开始,我们自己动手,通过源码构建一个属于我们自己的jdk,该过程虽然不是必须的,但了解这些过程,对于我们理解后文,以及后续的jvm研究,都是有一定的帮助的。

首先,下载jdk源码:

$ git clone https://github.com/openjdk/jdk.git

源码下载完毕后,我们看下jdk内部大致的目录结构:

该目录中的 doc/building.html 详细说明了如何构建一个jdk,有兴趣的同学可以好好看下。

在jdk目录里,我们执行以下命令,要求构建一个debug版本的jdk,并指定其安装路径为jdk-build:

$ bash configure --with-debug-level=slowdebug --with-native-debug-symbols=internal --prefix=$HOME/jdk-build

如果该命令执行过程中没有问题,则会有类似于下图的输出:

configure命令执行成功后,我们再执行下面的命令,开始真正构建jdk,并将构建成功后的jdk安装到jdk-build目录里:

$ make images
$ make install

以上两个命令成功后,我们可以切换到jdk-build目录,看下新构建的jdk:

好了,我们已经有了自己的jdk了,下面我们可以用它来查看java方法的字节码及汇编代码。

首先,准备下列文件:

我们先来看下如何查看字节码,这个大家应该都知道,但我这里还是演示下:

上图是通过jdk自带的javap命令来查看java的字节码,其实还有很多其他的方式,比如各种ide中集成的工具,这里我们就不一一演示了。

javap还有很多参数,比如 -p -v 等都非常有用,有兴趣的可以自己试下。

字节码就说这些,下面我们主要来看下如何查看java方法的汇编代码。

想要查看java方法在jit编译后的汇编代码,我们不仅要在执行java命令时指定一些参数,还需要一个额外的小工具,来辅助我们解汇编代码。

如果没有这个工具,jvm输出的是机器码,是不可读的,有了这个工具,它可以帮我们自动将机器码转成汇编代码,非常方便。

这个工具就是hsdis,它的源码就在jdk里,但构建jdk的过程并不会构建这个工具,如果我们想要使用它,要单独构建。

由上图可见,该工具还是非常简单的,它主要是通过调用gnu的binutils来解jvm输出的汇编代码,该工具的详细构建过程可以参考README和Makefile。

因为该工具依赖gnu binutils解码,所以我们要先下载binutils:

下载完binutils后,我们执行以下命令,开始构建hsdis:

$ make BINUTILS=binutils-2.35.1 all64

如果没有问题的话,最终会在build/linux-amd64目录下生成一个hsdis-amd64.so文件:

将该文件拷贝到我们之前构建好的jdk里:

好,准备工作已经完成,现在我们可以通过指定一些参数,来查看java方法的汇编代码了。

我们还是用上面那个java类T.java,假设我们想查看方法f1在jit编译后的汇编代码,可以使用下面的命令:

该命令会输出很多内容,而下图中的就是我们想要的:

看到没,真的是汇编,且选中行就是方法f1的相加逻辑。

我们可以通过不同的参数来指定要查看的某个方法或某些方法,我们也可以通过-XX:+PrintAssembly参数,来查看所有被jit编译的方法。

有关各参数的使用及意义,请参考以下链接:

https://docs.oracle.com/en/java/javase/15/docs/specs/man/java.html

查看java方法的汇编代码,对于我们理解java的内部实现,是非常有意义的,通过这种方式的辅助,我们可以理解很多文档上难以理解的内容,比如 volatile。


好,就这些,写文章不易,如果可以的话,帮忙转发下或给个在看,谢谢。

本文分享自微信公众号 - Linux内核及JVM底层相关技术研究(ytcode),作者:wangyuntao

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-10-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如果编程语言是一门武功绝学

    武侠小说中,各路侠客绿林好汉都是从基本功开始一招一式学起,掌握了足够多的招式后,加之勤学苦练,量变引起质变,会有一天打开任督二脉顿悟出这些招式背后的哲学逻辑,成...

    C语言与CPP编程
  • 如果编程语言是一门武功绝学

    武侠小说中,各路侠客绿林好汉都是从基本功开始一招一式学起,掌握了足够多的招式后,加之勤学苦练,量变引起质变,会有一天打开任督二脉顿悟出这些招式背后的哲学逻辑,成...

    C语言与CPP编程
  • 如果编程是一门武功绝学,C语言是葵花宝典还是辟邪剑谱?

    武侠小说中,各路侠客绿林好汉都是从基本功开始一招一式学起,掌握了足够多的招式后,加之勤学苦练,量变引起质变,会有一天打开任督二脉顿悟出这些招式背后的哲学逻辑,成...

    小林C语言
  • IDEA 的 debug 怎么实现?出于这个好奇心,我越挖越深!

    公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。

    java进阶架构师
  • 程序员入门之路

    我大学的专业是软件工程。那个时候(我09年毕业),ACM等各类算法竞赛在大学还不是特别地流行。专门搞算法的同学不多,我也没有特地去训练和参加算法竞赛,所以我有很...

    sergiojune
  • 你为什么需要 Kotlin

    导语 在当今的互联网时代,新技术犹如雨后春笋般层出不穷。精神哥之前也和开发同学一起讨论过程序员的成长离不开哪些软技能?当时很多人都有提到探究新技术对程序员的重要...

    腾讯Bugly
  • JAVA、C、C++、Python同样是高级语言,为什么只有C和C++可以编写单片机程序?

    从事编程十几年,JAVA、C、C++、Python这四种编程语言都玩过,前三种玩的比较多,python做为兴趣爱好或者玩脚本的时候弄过,编程语言在使用的时候主要...

    程序员互动联盟
  • 2019 最新 Java 核心技术教程,都在这了!

    以下是Java技术栈微信公众号发布的所有关于 Java 的技术干货,会从以下几个方面汇总,本文会长期更新。

    Java技术栈
  • 还在收集资料?我这里有个github汇总

    国内程序员都喜欢收集资料,但是又不看,github是重灾区。更有莫名其妙fork的,让人不得要领。这些资料其实也代表了收集者的一个思路,还是有不小参考价值的。

    xjjdog
  • 好码分享:开源算法框架Open Tabu Search求解VRPTW的JAVA代码

    很早之前就想写这篇文章了,由于各种不可描述的原因拖延到了现在,今儿就把坑给填上吧~

    短短的路走走停停
  • 为什么Java、Python会成为程序员最害怕的编程语言?

    这是 O'Reilly 发布的“The Least Liked Programming Languages”(作者:Mike Loukides)英文文章的中文翻...

    深度学习与Python
  • 程序员写 2000 行 if else?领导:这个锅我不背

    知乎上有小伙伴提了这么一个问题,如何看待陕西省普通话水平测试成绩查询系统?查询系统前端代码就直接给出了身份账号,姓名,证书编号,如果信息是真的,就泄露了这么多考...

    小柒2012
  • Android 逆向工具篇—反编译工具的选择与使用

    在过去,当我们想要了解一个 app 内部运作细节时,往往先通过 ApkTool 反编译 APK,生成 smali 格式的反汇编代码[1],然后大佬和老手直接阅读...

    Python编程与实战
  • 历史上12位伟大的程序员

    所谓程序员,是指那些能够创造、编写计算机程序的人。不论一个人是什么样的程序员,或多或少,他都在为我们这个社会贡献着什么东西。然而,有些程序员的贡献却超过了一个普...

    苏易北
  • PHP 是最好的语言吗?

    最近被朋友们拉入了几个技术社群,有微信群,也有QQ群,尤其对一些年轻的朋友,大家乐此不疲的问题居然是 PHP 是最好的语言么?

    半吊子全栈工匠
  • 微信PC端多开的秘密

    手机端多开微信我知道,像华为、小米等手机系统都对此做了支持,不过在运行Windows系统的电脑上怎么启动两个微信呢,这倒是一下引起了我的好奇。

    轩辕之风
  • 代码写成这样,老板把我开除了,最让人感到无可奈何的代码,你可千万别这么写!

    后面有人挖出来这段神逻辑,大家真是哭晕在厕所了,还好,抢购买手机这种我从来不参加。。

    乔戈里
  • 2018程序员必读书单

    ? “如果能时光倒流,回到过去,作为一个开发人员,你可以告诉自己在职业生涯初期应该读一本,你会选择哪本书呢?这个书单列表内容丰富,涵盖很多东西。”欢迎大家在国...

    企鹅号小编
  • JITWatch查看字节码被JIT编译后的汇编代码

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

    Java艺术

扫码关注云+社区

领取腾讯云代金券