配景
我们知道Java代码通过编译器编译成字节码,一般是class文件,有JVM的各个类加载器加载后,昆山软件开发,按照JVM的启动设置可以举办表明执行和编译执行,编译执行是由JIT(Just In Time)Compiler将字节码编译成当地代码来提高执行速度,劳务派遣管理系统,缺点是编译自己会耗损时间而且会占用堆外空间(codecache中), 可是一般Server应用内存足够且可以或许忍受启动时的略微迟钝。
查察Java源代码对应的bytecode可以通过javap
来实现。
有时候我们想排盘查题可能相识底层是如何实现的,就需要查察JIT编译后的汇编代码是什么样的,Hotspot提供了-XX:+PrintAssembly
选项来输出编译后的汇编代码,缺点是输出日志量庞大,而且难以和代码中的对应起来。
JITWatch是一个查察JIT行为的可视化东西。
利用
安装和启动JitWatch
git clone https://github.com/AdoptOpenJDK/jitwatch cd jitwatch ./gradlew run
给JDK添加Hsdis
参考我的Github上的说明hsdis
通过以下呼吁检测下是否安装乐成
java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -version
昆山软件开发,而且设置输出日志">启动一个应用,而且设置输出日志
在应用中添加如下JVM参数
-XX:+UnlockDiagnosticVMOptions -XX:+TraceClassLoading -XX:+LogCompilation -XX:LogFile=/tmp/mylogfile.log -XX:+PrintAssembly -XX:+TraceClassLoading
然后在/tmp/mylogfile.log中就可以看到输出的日志了,在JITWatch界面中选择OpenLog选择日志,然后点击Open
然后选择想要查察的类和对应的要领,即可查察对应的源代码、ByteCode、JIT生成的AssemblyCode。
这里可以看到一个常常提到的volatile字段的实现,在MacOS x64的实现是在volatile write后添加一个lock
指令作为StoreLoad
屏障来担保可见性和防备重排序的。更多JMM的内容可以参考我的另一篇文章Java内存模子JMM浅析。