java字节码和汇编指令_Java使用字节码和汇编语言同步分析volatile,synchronized的底层实现...

版权声明:本文为博主原创文章,未经博主允许不得转载。https://blog.csdn.net/21aspnet/article/details/88571740

关于怎么查看字节码的五种方法参考本人另一篇文章《Java以及IDEA下查看字节码的五种方法》

查看汇编语言汇编码

说要看汇编还是很有必要的,因为有些地方比如加锁其实还是通过汇编实现的,只看字节码不能看出底层实现。

其实就是利用使用hsdis与jitwatch查看JIT后的汇编码。

1.首先下载hsids

要查看JIT生成的汇编代码,要先装一个反汇编器:hsdis。从名字来看,即HotSpot disassembler。

实际就是一个动态链接库。网络上有已经编绎好的文件,直接下载即可。

25093f64ce5d6d81094a27ff17e14f66

下载这2个文件拷贝到jre1.8.0_144\bin\server下:

edbdc098975022b122575bda96bb281a

通过以下命令可以测试是否安装成功:

[code]java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -version

df486640e1a25294b617c6bf4693ed31

这说明安装完成。

2.安装JITWatch

JITWatch是分析展现JIT日志等的图形界面工具。

8a9e4ba0a8aec872fcd492228cea9df6

下载好,本地解压开,然后在IDEA里导入项目然后编译之!

dd409fc1117f3dbce14bd4e27c835f51

首先要写一个足够复杂的类,让JIT编绎器认为它需要进行优化,不然产生的日志可能没什么内容。

启动launchUI.bat

ea6241f5fb22ddd3cf18337724cf2dfa

左上方有一个sanbox,点击会在当前目录下生成一个sanbox文件夹,里面存放着sanbox这个示例相关的代码,你也可以直接这里写代码。

[code]public class Test {

public volatile long sum = 0;

public int add(int a, int b) {

int temp = a + b;

sum += temp;

return temp;

}

public static void main(String[] args) {

Test test = new Test();

int sum = 0;

for (int i = 0; i < 1000000; i++) {

sum = test.add(sum, 1);

}

System.out.println("Sum:" + sum);

System.out.println("Test.sum:" + test.sum);

}

}

[code]

javac Test.java

java -server -XX:+UnlockDiagnosticVMOptions -XX:+TraceClassLoading -XX:+PrintAssembly -XX:+LogCompilation -XX:LogFile=E:\work\tmp\Test.log Test

13298eedc6b9ddfa9cf0f8c9d139cdfc

在tmp目录会生成对应文件,然后OpenLog打开,再Config好:

c32a51daeed66a0a095dec24ab72fce6

点“Start”解析:

05e7684ebb33b81a7c2551656d4b39b8

点击方法,弹出的页面就可以 源码,字节码,汇编码 同步了:

94f8e484ebe48098b8477e57cb3e7c63

7ef917f3fce2e3fe5f5d3ffc061a6868

可以看到实际上底层还是通过lock来实现,关于lock可以参考intel处理器指令。

46eb3f895369326e0b04dd7bb6ff9ad6

另外这一片帖子也可以参考《volatile,你了解多少》,作者多少有一点靠蒙的分析,这不科学,不过我觉得还是不如汇编来的彻底。

[code]import static java.lang.Thread.sleep;

public class TestAdd {

private static int count;

public static void main(String[] args) {

for (int i = 0; i < 10000; i++) {

new Thread() {

public void run() {

//System.out.println(">>>:");

synchronized(TestAdd.class){

//System.out.println(">>>>:");

count++;

//System.out.println("<<<<:>

}

}

}.start();

}

try {

sleep(10000);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("count:" + count);

}

}

f24fd04760a51d00ec29d4935ef92db4.png

0ccbe48c5991d692ff9239c2ebbc17d1

aa624dbc273dfebb627f57bee31f2788

30dd6f30fff1b579a1c95cb6c8518c13

参考文献:

在安装hsids和jitwatch过程中遇到一些问题参考了以下帖子

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值