Java:Hotspot JVM常见选项:修订间差异
imported>Soleverlee |
imported>Soleverlee |
||
(未显示同一用户的3个中间版本) | |||
第19行: | 第19行: | ||
=JIT编译器的模式:-Xint,-Xcomp,-Xmixed= | =JIT编译器的模式:-Xint,-Xcomp,-Xmixed= | ||
我们知道Java是一种解释型语言,但是随着JIT技术的进步,它能在运行时将Java的字节码编译成本地代码。以下是几个相关的选项: | |||
*Xint表示禁用JIT,所有字节码都被解释执行,这个模式的速度最慢的。 | |||
*Xcomp表示所有字节码都首先被编译成本地代码,然后再执行。 | |||
*Xmixed,默认模式,让JIT根据程序运行的情况,有选择地将某些代码编译成本地代码。 | |||
*Xcomp和-Xmixed到底谁的速度快,针对不同的程序可能有不同的结果,基本还是推荐用默认模式。 | |||
=显示开关= | |||
-version就是查看当前机器的java是什么版本,是什么类型的JVM(Server/Client),采用的是什么执行模式。比如,在我的机器上的结果如下: | |||
<source lang="bash"> | |||
$ java -version | |||
java version "1.7.0_71" | |||
Java(TM) SE Runtime Environment (build 1.7.0_71-b14) | |||
Java HotSpot(TM) 64-Bit Server VM (build 24.71-b01, mixed mode) | |||
</source> | |||
表示我机器上java是运行在mixed模式下的Server VM。 | |||
-showversion的作用是在运行一个程序的时候首先把JVM的版本信息打印出来,这样便于问题诊断。个人建议Server类型的程序都把这个选项打开,这样可以发现一些配置问题,比如程序需要JDK1.7才能运行,而有的机器上装有多个JDK的版本,打开这个选项可以避免使用了错误版本的Java。 | |||
与-showversion类似,-XX:+PrintCommandLineFlags可以让在程序运行前打印出用户手动设置或者JVM自动设置的XX选项,建议加上这个选项以辅助问题诊断。比如在我的机器上,JVM自动给配置了初始的和最大的HeapSize以及其他的一些选项: | |||
<source lang="bash"> | |||
$ java -XX:+PrintCommandLineFlags -version | |||
-XX:InitialHeapSize=134217728 -XX:MaxHeapSize=2147483648 -XX:+PrintCommandLineFlags -XX:+UseCompressedOops -XX:+UseParallelGC | |||
java version "1.7.0_71" | |||
Java(TM) SE Runtime Environment (build 1.7.0_71-b14) | |||
Java HotSpot(TM) 64-Bit Server VM (build 24.71-b01, mixed mode) | |||
</source> | |||
相关另外两个选项:-XX:+PrintFlagsInitial表示打印出所有XX选项的默认值,-XX:+PrintFlagsFinal表示打印出XX选项在运行程序时生效的值。 | |||
=垃圾回收= | |||
*https://www.zybuluo.com/jewes/note/57352 | *https://www.zybuluo.com/jewes/note/57352 | ||
[[Category:Programe]] | [[Category:Programe]] |
2017年1月18日 (三) 10:11的最新版本
选项的分类
Hotspot JVM提供以下三大类选项:
- 标准选项:这类选项的功能是很稳定的,在后续版本中也不太会发生变化。运行java或者java -help可以看到所有的标准选项。所有的标准选项都是以-开头,比如-version, -server等。
- X选项:比如-Xms。这类选项都是以-X开头,可能由于这个原因它们被称为X选项。运行java -X命令可以看到所有的X选项。这类选项的功能还是很稳定,但官方的说法是它们的行为可能会在后续版本中改变,也有可能不在后续版本中提供了。
- XX选项:这类选项是属于实验性,主要是给JVM开发者用于开发和调试JVM的,在后续的版本中行为有可能会变化。
- 如果是布尔类型的选项,它的格式为-XX:+flag或者-XX:-flag,分别表示开启和关闭该选项。
- 针对非布尔类型的选项,它的格式为-XX:flag=value
JVM的类型:-server,-client
Hotspot JVM有两种类型,分别是server和client。它们的区别是Server VM的初始堆空间会大一些,默认使用的时并行垃圾回收器。Client VM相对来讲会保守一些,初始堆空间会小一些,使用串行的垃圾回收器,它的目标是为了让JVM的启动速度更快。
JVM在启动的时候会根据硬件和操作系统会自动选择使用Server还是Client类型的JVM。
- 在32位Windows系统上,不论硬件配置如何,都默认使用Client类型的JVM。
- 在其他32位操作系统上,如果机器配置有2GB集群以上的内存同时有2个以上的CPU,则默认会使用Server类型的JVM
- 64位机器上只有Server类型的JVM。也就是说Client类型的JVM只在32位机器上提供。
- 你也可以使用-server和-client选项来指定JVM的类型,不过只在32位的机器上有效,原因见上面一条。
详细内容请参见:http://docs.oracle.com/javase/7/docs/technotes/guides/vm/server-class.html
JIT编译器的模式:-Xint,-Xcomp,-Xmixed
我们知道Java是一种解释型语言,但是随着JIT技术的进步,它能在运行时将Java的字节码编译成本地代码。以下是几个相关的选项:
- Xint表示禁用JIT,所有字节码都被解释执行,这个模式的速度最慢的。
- Xcomp表示所有字节码都首先被编译成本地代码,然后再执行。
- Xmixed,默认模式,让JIT根据程序运行的情况,有选择地将某些代码编译成本地代码。
- Xcomp和-Xmixed到底谁的速度快,针对不同的程序可能有不同的结果,基本还是推荐用默认模式。
显示开关
-version就是查看当前机器的java是什么版本,是什么类型的JVM(Server/Client),采用的是什么执行模式。比如,在我的机器上的结果如下:
$ java -version
java version "1.7.0_71"
Java(TM) SE Runtime Environment (build 1.7.0_71-b14)
Java HotSpot(TM) 64-Bit Server VM (build 24.71-b01, mixed mode)
表示我机器上java是运行在mixed模式下的Server VM。
-showversion的作用是在运行一个程序的时候首先把JVM的版本信息打印出来,这样便于问题诊断。个人建议Server类型的程序都把这个选项打开,这样可以发现一些配置问题,比如程序需要JDK1.7才能运行,而有的机器上装有多个JDK的版本,打开这个选项可以避免使用了错误版本的Java。
与-showversion类似,-XX:+PrintCommandLineFlags可以让在程序运行前打印出用户手动设置或者JVM自动设置的XX选项,建议加上这个选项以辅助问题诊断。比如在我的机器上,JVM自动给配置了初始的和最大的HeapSize以及其他的一些选项:
$ java -XX:+PrintCommandLineFlags -version
-XX:InitialHeapSize=134217728 -XX:MaxHeapSize=2147483648 -XX:+PrintCommandLineFlags -XX:+UseCompressedOops -XX:+UseParallelGC
java version "1.7.0_71"
Java(TM) SE Runtime Environment (build 1.7.0_71-b14)
Java HotSpot(TM) 64-Bit Server VM (build 24.71-b01, mixed mode)
相关另外两个选项:-XX:+PrintFlagsInitial表示打印出所有XX选项的默认值,-XX:+PrintFlagsFinal表示打印出XX选项在运行程序时生效的值。