正在运行哪个Java HotSpot JIT编译器?

11

我想知道我的无 VM 参数调用 HotSpot Java 是否使用了 -client、-server 或分层编译选项。当我没有提供 VM 参数时,默认选择哪个选项?有没有一种方法可以输出关于正在运行的 JIT 编译器的诊断信息?

3个回答

5
假设这是热点:
-XshowSettings:vm

例如,在我的 Windows 电脑上,输出如下:
VM settings:
    Max. Heap Size (Estimated): 1.77G
    Ergonomics Machine Class: client
    Using VM: Java HotSpot(TM) 64-Bit Server VM

谢谢Jon。我正在OS X上运行Hotspot,但对于Java 1.6和1.7,该选项未被识别,唉。 - Julien Chastang
@JulienChastang:很奇怪——在Windows和Linux上都没问题。java -X显示了什么? - Jon Skeet
我的错。实际上在1.6中它是无法识别的,但在1.7中它给我提供了你上面提供的那种信息。有趣的是,当我提供java -client -XshowSettings:vm时,它仍然声称是Server。Charles Nutter(http://blog.headius.com/2009/01/my-favorite-hotspot-jvm-flags.html)似乎暗示如果你使用64位,-server是唯一的选择。从Oracle方面获得一些明确的信息会很好。 - Julien Chastang

2
从运行的程序中,你可以查询java.vm.name属性来区分客户端和服务器模式。在Hotspot中,如果你使用了该选项,它将包含"Server"(例如:Java HotSpot(TM) 64-Bit Server VM)。
根据这个页面

分层编译现在是服务器VM的默认模式。

注意:现在它可以工作,但可能不是最具未来性的方法。

1

确定正在使用的JIT编译器的稍微好一些的方法。

在安装有32位JDK8的Windows机器上:

    $ java -version
    java version "1.8.0"
    Java(TM) SE Runtime Environment(build 1.8.0-b132)
    Java HotSpot(TM) Client VM(build 25.0-b70,mixed mode)
$ java -XshowSettings -version 2>&1 | grep sun.management.compiler sun.management.compiler = HotSpot Client Compiler $ java -server -XshowSettings -version 2>&1 | grep sun.management.compiler sun.management.compiler = HotSpot Tiered Compilers

因此,在Windows 32位JDK8中,客户端编译器是默认的选项,并且'-server'选项可以获取32位分层编译器。

在安装有64位JDK8的Windows机器上:

    $ java -version
    Java版本 "1.8.0"
    Java(TM) SE Runtime Environment(版本1.8.0-b132)
    Java HotSpot(TM) 64-Bit Server VM(版本25.0-b70,混合模式)
$ java -XshowSettings -version 2>&1 | grep sun.management.compiler sun.management.compiler = HotSpot 64位分层编译器

因此,分层编译器是Windows 64位JDK8的默认设置。 Oracle不提供64位客户端VM。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接