您现在的位置是:亿华云 > 数据库
居然还有方式可以查看Java方法的汇编代码,真是神奇
亿华云2025-10-09 06:56:06【数据库】7人已围观
简介当我们在研究java的内部实现时,经常会需要查看java方法的字节码,有时为了确定一些问题,甚至还需要查看某些方法在jit编译后的汇编代码。这篇文章我们从零开始,详细说一下如何查看java方法的字节码
当我们在研究java的真是神奇内部实现时,经常会需要查看java方法的还有汇编字节码,有时为了确定一些问题,式a方法甚至还需要查看某些方法在jit编译后的可查看汇编代码。
这篇文章我们从零开始,代码详细说一下如何查看java方法的真是神奇字节码以及汇编代码,希望能给有这方面困惑的还有汇编同学提供一些帮助。
为了真正意义上的式a方法从零开始,我们自己动手,可查看通过源码构建一个属于我们自己的代码jdk,该过程虽然不是真是神奇必须的,但了解这些过程,还有汇编对于我们理解后文,式a方法以及后续的可查看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。
本文转载自微信公众号「卯时卯刻」,可以通过以下二维码关注。转载本文请联系卯时卯刻公众号。
很赞哦!(6167)
相关文章
- 以上的就是为大家介绍的关于域名的详解域名注册:域名注册0
- 谷歌助力,快速实现 Java 应用容器化
- 推荐这几款开发流程增强工具让您事半功倍
- Javascript面试的完美指南(开发者视角)
- 为什么起域名意义非凡?起域名有什么名堂?
- Java 8中处理集合的优雅姿势——Stream
- 干了4年程序员,转行做公务员,月薪2万变2千,赚了还是赔了?
- 互联网架构“高并发”到底怎么玩?
- 2、根据用户基础选择访问提供程序。由于互联问题的存在,接入商的选择也非常重要,如果用户群主要在联通,尽量选择联通接入较好的接入商,如果用户群主要在电信,那么选择电信接入较好的接入商。如果用户组位于国家/地区,则选择更好的访问提供程序进行交互。
- 13个超实用的Vue PC端框架!
热门文章
站长推荐
2、根据用户基础选择访问提供程序。由于互联问题的存在,接入商的选择也非常重要,如果用户群主要在联通,尽量选择联通接入较好的接入商,如果用户群主要在电信,那么选择电信接入较好的接入商。如果用户组位于国家/地区,则选择更好的访问提供程序进行交互。
刚刚,阿里开源 iOS 协程开发框架 coobjc!
从 JDK 中,我们能学到哪些设计模式?
我为什么选择 Vue 而不是 React?
4、企业无形资产:通用网站已成为企业网络知识产权的重要组成部分,属于企业的无形资产,也有助于提升企业的品牌形象和技术领先形象。它是企业品牌资产不可或缺的一部分。
Python、Java、TypeScript 和 Perl 作者谈语言设计
只有 32 位的 IPv4,为何依然够用?
重新定义程序员职业,Facebook推出代码推荐工具Aroma