IT袋

当前位置:主页 > 经验教程 > 建站编程 >

JVM解释和编译指南

JVM解释和编译指南(4)

时间:2023-11-09 14:37:26 来源:IT袋 作者:马勇
导读:JVM解释和编译指南,TieredCompilation 时 -XX:CompileThreshold 才会生效: $ java -Xbatch -XX:+PrintCompilation -XX:CompileCommandFile=hotspot_compiler \-XX:-TieredCompilation -XX:CompileThreshold=5 Demo124 1 n java.

JVM解释和编译指南

TieredCompilation-XX:CompileThreshold才会生效:

$ java -Xbatch -XX:+PrintCompilation -XX:CompileCommandFile=hotspot_compiler \
-XX:-TieredCompilation -XX:CompileThreshold=5 Demo
124     1       n       java.lang.invoke.MethodHandle::linkToStatic(LLLLLL)L (native)   (static)
127     2       n       java.lang.invoke.MethodHandle::invokeBasic(LLLLL)L (native)   
[...]
1 iteration
        187   40        n       java.lang.invoke.MethodHandle::linkToStatic(ILIIL)I (native)   (static)
[...]
(native)   (static)
        212   54        n       java.lang.invoke.MethodHandle::invokeBasic(J)L (native)   
        212   55        n       java.lang.invoke.MethodHandle::linkToSpecial(LJL)L (native)   (static)
Time taken= 12337415
[...]
--------------------------------
4 iteration
Square(i) = 16
Time taken= 37183
--------------------------------
5 iteration
        214   56        b       Demo::

可以看到在第五次迭代之后,代码片段被 JIT 编译了:

--------------------------------
5 iteration
        214   56        b       Demo::

可以看到,与square方法一起,构造方法也被 JIT 编译了。在for循环中调用square之前要先构造Demo实例,所以构造方法的解释次数同样达到 JIT 编译阈值。这个例子说明了在解释发生之后何时 JIT 会介入。

要查看编译后的代码,需要使用-XX:+PrintAssembly标志,该标志仅在库路径中有反汇编器时才起作用。对于 OpenJDK,使用hsdis作为反汇编器。下载合适版本的反汇编程序库,在本例中是hsdis-amd64.so,并将其放在Java_HOME/lib/server目录下。使用时还需要在-XX:+PrintAssembly之前增加-XX:+UnlockDiagnosticVMOptions选项。否则,JVM 会给你一个警告。

完整命令如下:

$ java -Xbatch -XX:+PrintCompilation -XX:CompileCommandFile=hotspot_compiler \ -XX:-TieredCompilation -XX:CompileThreshold=5 -XX:+UnlockDiagnosticVMOptions \ -XX:+PrintAssembly Demo
[...]
5 iteration
        178   56        b       Demo::

我只截取了输出中与Demo.java相关的部分。

现在再来看看 AOT 编译。它是在 JDK9 中引入的特性。AOT 是用于生成.so这样的库文件的静态编译器。用 AOT 可以将指定的类编译成.so库。这个库可以直接执行,而不用解释或 JIT 编译。如果 JVM 没有检测到 AOT 编译的代码,它会进行常规的解释和 JIT 编译。

使用 AOT 编译的命令如下:

$ jaotc --output=libDemo.so Demo.class

用下面的命令来查看共享库的符号表:

$ nm libDemo.so

要使用生成的.so库,使用-XX:+
UnlockExperimentalVMOptions
-XX:AOTLibrary

$ java -XX:+UnlockExperimentalVMOptions -XX:AOTLibrary=./libDemo.so Demo
1 iteration
Square(i) = 1
Time taken= 7831139
--------------------------------
2 iteration
Square(i) = 4
Time taken= 36619
[...]
10 iteration
Square(i) = 100
Time taken= 42085

相关阅读

  • 找装修公司去哪个网站好 网上找装修公司的小窍门

    找装修公司去哪个网站好 网上找装修公司的小窍门

    对于许多网友来说找装修公司去哪个网站好和网上找装修公司的小窍门IT技巧方面的经验,下面IT袋为您详细介绍 现在的互联网大大改善了生活便捷度,装修网站作为专业化装修服务平台,为广

  • 如何实现一个IOC容器?

    如何实现一个IOC容器?

    小编为大家说一说如何实现一个IOC容器的相关经验,一起来了解了解吧。 概括来说分为四步: 配置文件配置包扫描路径 递归包扫描获取.class文件 反射、确定需要交给IOC管理的类 对需要注入的

  • 如何自建云服务器设置 搭建一个私有云平台

    如何自建云服务器设置 搭建一个私有云平台

    小编为网友们解答如何自建云服务器设置和搭建一个私有云平台方面的知识,具体详情如下: 如果选择云服务器的配置,总的来说要根据应用场景需求来。在云服务器的产品页面,会根据不同

  • 深入学习:MySQL中查询重复数据的有效方法

    深入学习:MySQL中查询重复数据的有效方法

    一篇方法教程,与您分享的IT小经验,接下来分享详细内容。 在进行数据库操作时,我们经常需要找出重复的数据。 在MySQL数据库中,有多种方法可以实现这个目标。 本文将向你展示如何在