Java使用字节码和汇编语言同步分析volatile,synchronized的底层实现 |
您所在的位置:网站首页 › 汇编语言分析 › Java使用字节码和汇编语言同步分析volatile,synchronized的底层实现 |
关于怎么查看字节码的五种方法参考本人另一篇文章《Java以及IDEA下查看字节码的五种方法》 查看汇编语言汇编码说要看汇编还是很有必要的,因为有些地方比如加锁其实还是通过汇编实现的,只看字节码不能看出底层实现。 其实就是利用使用hsdis与jitwatch查看JIT后的汇编码。 1.首先下载hsids要查看JIT生成的汇编代码,要先装一个反汇编器:hsdis。从名字来看,即HotSpot disassembler。 实际就是一个动态链接库。网络上有已经编绎好的文件,直接下载即可。 https://github.com/jkubrynski/profiling/tree/master/bin 下载这2个文件拷贝到jre1.8.0_144\bin\server下: 通过以下命令可以测试是否安装成功: java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -version这说明安装完成。 2.安装JITWatch JITWatch是分析展现JIT日志等的图形界面工具。 https://github.com/AdoptOpenJDK/jitwatch 下载好,本地解压开,然后在IDEA里导入项目然后编译之! 首先要写一个足够复杂的类,让JIT编绎器认为它需要进行优化,不然产生的日志可能没什么内容。 启动launchUI.bat 左上方有一个sanbox,点击会在当前目录下生成一个sanbox文件夹,里面存放着sanbox这个示例相关的代码,你也可以直接这里写代码。 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); } } javac Test.java java -server -XX:+UnlockDiagnosticVMOptions -XX:+TraceClassLoading -XX:+PrintAssembly -XX:+LogCompilation -XX:LogFile=E:\work\tmp\Test.log Test在tmp目录会生成对应文件,然后OpenLog打开,再Config好: 点“Start”解析:
可以看到实际上底层还是通过lock来实现,关于lock可以参考intel处理器指令。 另外这一片帖子也可以参考《volatile,你了解多少》,作者多少有一点靠蒙的分析,这不科学,不过我觉得还是不如汇编来的彻底。 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(" |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |