浅谈jdk中javap工具的使用

本文介绍了jdk中的javap工具,用于查看和分析字节码。通过一个实例展示了如何使用javap验证count++非原子操作,以及讨论了javap的常用选项,强调了掌握字节码对优化和理解Java程序的重要性。

今天在探究多线程的时候,想验证一下count++;(int count;)是不是一个原子操作,后来看了别人的解释才发现可以用javap来进项查看:

那么,

一、首先我们得了解什么是javap,它可以用来干啥子?

大多数Java程序员知道他们的程序不是编译成本机代码的。实际上,程序被编译成中间字节代码,由Java虚拟机来解释执行。然而,很少程序员注意一下字节代码,因为他们使用的工具不鼓励他们这样做。大多数的Java调试工具不允许单步的字节代码调试。这些工具要么显示源代码,要么什么都不显示。幸好JDK提供了Java类分解器javap,一个命令行工具。javap对类名给定的文件(.class)提供的字节代码进行反编译,打印出这些类的一个可读版本。在缺省情况下,javap打印出给定类内的公共域、方法、构造函数,以及静态初始值。 

二、知道是什么之后,那么它怎么用?

javap的具体用法 
语法: javap <选项> <类名> ,这样看起来好像有一点含糊,所以接下来我们写一个实际的例子,来进行探讨,手把手教学使用javap。

三、javap的常规使用以及分析结果

3.1、案例:这里我们验证count++是不是原子操作:

java代码:

public class test {
    
    private static int count = 1 ;
    
    public void increase(){
        count++;
    }

}

然后使用javac命令来编译这个.java文件以生成.class文件-------------------win+r----cmd----切换到test.java的目录下,然后输入javac test.java------回车,就会在同级目录下产生test.class文件,这里我们用记事本或者notapad打开发现是乱码,没法观看。

此时就可以使用javap命令来给我们帮助了:

在cmd中输入javap -c -p test.class即可:

这里我们可以看到在increase方法中,count++对应的机器码有5个(getstatic:取count的值,放在操作数堆栈中;iconst_1:将int类型常量1压入栈;iadd:进行操作数相加操作;putstatic:把结果放回操作数堆栈中;return :返回。拙见,不正确的话欢迎纠正。),这就说明count++并不是一个原子操作。

3.2:javap的常用选项:在cmd中输入javap --help,或者javap -help 或者javap -?即可

C:\Users\袁\Desktop>javap --help
用法: javap <options> <classes>
其中, 可能的选项包括:
  -help  --help  -?        输出此用法消息
  -version                 版本信息
  -v  -verbose             输出附加信息
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值