HotSpot 选项笔记

原文:http://www.jinbuguo.com/java/hotspot_options.html

语法

java [ options ] class [ argument ... ]

java [ options ] -jar file.jar [ argument ... ]

标准选项

-d32|-d64

-client|-server

以客户端模式还是服务器模式执行虚拟机。

服务器模式的特点是启动速度比较慢,但运行时性能和内存管理效率很高,适用于生产环境。

对于64位虚拟机而言,服务器模式是默认值,也是唯一支持的模式。

-agentlib:库名[=启动选项]

-agentpath:绝对路径[=启动选项]

从指定的路径(必须是绝对路径)/库名称中加载JVMT Tool Interface agent库(还可传递启动选项)。

例如:

-agentlib:foo=opt1,opt2

-agentpath:/opt/lib/foo.so=opt1,opt2

-classpath 路径列表

-cp 路径列表

指定一个搜索classic文件的目录/JAR/ZIP列表,列表项之间用分号(;)分隔。

这里指定的值将会覆盖CLASSPATH环境变量的设置。

如果既没有指定 -classpath 也没有设置CLASSPATH环境变量,那么其默认值将是用户的当前目录(.)

可以用星号(*)作为通配符,表示目录下的所有.jar文件。单独一个星号表示用户的当前目录下的所有.jar文件。

-D属性=值

将系统”属性”设为”值”。如果”值”是一个包含空格的字符串,那么必须用双引号进行界定。

-enableassertions[:包名”…” | :类名 ]

-ea[:包名”…” | :类名 ]

-disableassertions[:包名”…” | :类名 ]

-da[:包名”…” | :类名 ]

为指定的包或者类启用/禁止断言,默认值为禁止。

-enablesystemassertions

-esa

-disablesystemassertions

-dsa

仅对所有的系统类启用/禁止断言

-jar file.jar

执行封装在file.jar文件内的程序。

使用此选项后,file.jar文件内必须包含所有的用户class,并且所有-classpath选项都将被忽略。

-javaagent:jar文件[=选项]

指定jvm启动时装入java语言代理。参见:java.lang.instrument

-jre-restrict-search

-no-jre-restrict-search

在版本搜索的时候,包含/排除用户私人的JRE

-verbose

-verbose:class

输出jvm载入类的相关信息,当jvm报告说找不到类或者类冲突时可此进行诊断。

-verbose:gc

输出每次垃圾回收的相关情况。

-verbose:jni

输出native方法调用的相关情况,一般用于诊断jni调用错误信息。

-version

输出java的版本信息

-version:版本信息

指定class或者jar运行时需要的jdk版本信息;若指定版本未找到,则以能找到的系统默认jdk版本执行;

一般情况下,对于jar文件,可以在manifest文件中指定需要的版本信息,而不是在命令行。

“版本信息”中可以指定单个版本,也可以指定一个列表,中间用空格隔开,且支持复杂组合,例如:-version:”1.6.0_13 1.6* & 1.6.0_10+”

-showversion

输出java版本信息(与-version相同)之后,继续输出java的标准参数列表及其描述。

-?

-help

输出java标准参数列表及其描述。

-X

输出非标准的参数列表及其描述。

非标准选项

-Xint

仅以解释模式运行虚拟机,全部字节码都以解释方式执行

-Xcomp

仅以编译模式运行虚拟机,优先采用编译方式执行字节码,仅在无法编译的情况下解释器才介入执行

-Xmixed

以混合模式运行虚拟机,对热点代码使用编译器执行,其他代码使用解释器执行。这是默认值。

-Xbatch

禁止后台编译。

默认情况下,对于尚未编译完成的热点代码,虚拟机会先使用解释方式执行,同时将编译任务放到后台。

此选项将会把编译任务放到前台进行,直到编译完成后再继续执行。

-Xbootclasspath:启动类路径

-Xbootclasspath/a:路径

-Xbootclasspath/p:路径

指定一个分号(;)分隔的目录/JAR/ZIP列表,在其中搜索boot class

此选项用于改变虚拟机自带的系统运行包”rt.jar”,除非你自己能写一个运行时,否则不会用到该参数。

/a:在默认搜索路径后加上path中的搜索路径。

/p:在默认搜索路径前加上path中的搜索路径。

-Xcheck:jni

调用JNI(Java Native Interface)函数时进行额外的检查,特别地,虚拟机将校验传递给JNI函数参数的合法性。

在本地代码中遇到非法数据时,虚拟机将报一个致命错误而终止。使用该参数后将造成性能下降。

-Xfuture

对类文件进行严格的格式检查,以保证类代码严格符合新规范。

为保持向后兼容1.1.x版本的JDK,虚拟机缺省不进行严格的格式检查。

建议明确开启此参数,特别是在开发阶段。

-Xnoclassgc

关闭虚拟机对class的垃圾回收功能。很可能会导致OutOfMemoryError异常。

-Xincgc

启动增量垃圾收集器(默认关闭)。

增量垃圾收集器能减少偶然发生的长时间垃圾回收造成的暂停时间。

但增量垃圾收集器和应用程序并发执行,因此会抢占部分应用程序的CPU资源。

-Xloggc:文件

将虚拟机每次垃圾回收的信息写到”文件”中,内容和 -verbose:gc 的输出内容相同,但增加了时间戳。

务必指定一个本机文件,以避免因为网络拥堵造成虚拟机停顿。

当文件系统被填满后,日志文件会被自动从头截掉(类似日志滚动),并继续记录。

如果同时使用了 -verbose:gc 和本选项,那么 -verbose:gc 将会被忽略。

-Xms字节数

设置初始Java heap的大小,可以使用K或M或G后缀。建议和-Xmx设为相同。

-Xmx字节数

设置最大Java heap的大小,可以使用K或M或G后缀。建议和-Xms设为相同。

-Xss字节数

设置单个java线程的stack大小,可以使用K或M后缀。

在64bit平台上默认是1024K,在32bit平台上默认是512K。

建议不要设的太大(一般设为256K),若无特殊情况,512K已经绰绰有余了。

-Xprof

对运行中的程序进行性能分析(profile),并将结果发送到标准输出。仅用于开发目的,切勿用于生产环境!

-Xrs

Shutdown Hook功能允许应用程序在终止前(可能是虚拟机自身被终止所致)执行一些诸如关闭数据库连接之类的清理操作。

JVM会注册一个控制台控制句柄(console control handler),用于捕获要求虚拟机进程终止的控制信号。

该句柄会触发shutdown-hook进程,同时对 SIGHUP, SIGINT, SIGTERM, CTRL_LOGOFF_EVENT 信号返回TURE。

如果JVM是作为service运行(例如Tomcat),它可以接受CTRL_LOGOFF_EVENT信号但却不应该终止整个进程。

使用该选项之后,JVM将不会注册控制台控制句柄,因此也就不会对上述信号做出响应。

使用此选项会造成如下两个后果:

(1)Ctrl-Break线程转储功能将不可用

(2)应用程序代码必须自己负责触发Shutdown Hook,比如在JVM终止前调用System.exit()方法。

不稳定选项

这些”不稳定”选项的意思是很容易在没有通知的情况下改变。语法格式如下:

-XX:+OPT    开启OPT选项

-XX:-OPT 关闭OPT选项

-XX:OPT=VAL 将OPT选项的值设为VAL

说明:”=”后面的内容表示的是此选项的默认值。

内存管理参数

JVM最大总内存 = 线程数*(-Xss) + (-Xmx) + MaxPermSize + MaxDirectMemorySize + ReservedCodeCacheSize

DisableExplicitGC = false

忽略程序中System.gc()方法触发的垃圾收集动作

MaxDirectMemorySize = -1

最大直接内存大小,可以使用K或M或G后缀。默认值”-1″表示使用-Xmx的值。

PermSize = [依赖于物理内存大小]

永久代区域的初始值,可以使用K或M或G后缀。

MaxPermSize = [依赖于物理内存大小]

永久代区域的最大值,可以使用K或M或G后缀。

一些JSP页面可能需要很大的永久代去存放动态生成与加载的类。

NewRatio = 2

老年代对新生代的比例。默认值2表示老年代是新生代大小的2倍。

如果想要更精细的调整新生代的大小,应该使用下面两个参数:

NewSize = [依赖于-Xms,-Xmx的设置]

新生代大小的初始值(最小值),可以把这个参数设成与MaxNewSize相同来固定新生代的大小

MaxNewSize = 无穷大

新生代大小的最大值(上限),可以把这个参数设成与NewSize相同来固定新生代的大小

SurvivorRatio = 8

新生代中Eden区域与Survivor区域容量的比值。

默认值8表示Eden区的容量是Survivor区的8倍。

因为有两个Survivor区,所以Eden:Survivor1:Survivor2=8:1:1

PretenureSizeThreshold = 0

直接晋升到老年代的对象大小阈值(无默认值),大于这个值的对象将直接在老年代内分配

MaxTenuringThreshold = 15

晋升到老年代的对象的年龄阈值。

对象每坚持过一次Minor GC之后,年龄加1,当超过这个阈值之后,该对象将进入老年代

UseAdaptiveSizePolicy = true

允许JVM动态调整java堆中老年代、新生代区域的大小以及进入老年代的年龄

UseG1GC = false

使用G1(Garbage First)垃圾收集器

GCTimeRatio = 9

垃圾回收时间占总运行时间的比率=1/(1+GCTimeRatio)。默认值9表示最大允许1/(1+9)=10%的时间用于GC

MaxGCPauseMillis = 200

设置GC最大停顿时间,也就是在垃圾回收时允许正常工作进程最大允许停顿多长时间,单位是毫秒

GCPauseIntervalMillis = 201

设置两次GC之间的时间间隔,也就是每隔多长时间可以接受一次GC停顿 ,单位是毫秒

UseGCOverheadLimit = true

如果有过多的时间花费在垃圾收集上(超过98%),就抛OutOfMemoryError异常。

这个功能是用来防止堆太小导致程序长时间无法正常工作而设计的。

UseCompressedOops = false

指针压缩功能

即时编译参数

BackgroundCompilation = true

使用后台编译。也就是在将方法编译为本地代码完成之前,先解释执行,而不是暂停执行

TieredCompilation = false

启用分层编译策略:C0为解释执行,C1进行可靠优化编译,C2进行激进优化编译。

分层编译可以逐步优化代码,以使最终运行速度更快,且降低C2编译时对执行速度的影响,建议开启。

InitialCodeCacheSize = 4M

即时编译器编译的代码缓存的初始值,可以使用K或M或G后缀。

ReservedCodeCacheSize = 48M

即时编译器编译的代码缓存的最大值,可以使用K或M或G后缀。

CompileThreshold = 10000

触发即时编译的阈值。

当调用计数器(用于函数)或者回边计数器(用于代码块)超过此值时,将被编译为机器码

InterpreterProfilePercentage = 33

OnStackReplacePercentage = 140

用于计算回边计数器阈值的两个参数,当计算结果大于CompileThreshold时,代码块所在的函数将被编译为机器码。

回边计数器阈值=CompileThreshold*(OnStackReplacePercentage-InterpreterProfilePercentage)/100

UseCounterDecay = true

对方法调用计数器使用热度衰减算法。

建议关闭热度衰减算法,这样,只要运行时间足够长,绝大部分方法都将被编译成本地代码

类型加载参数

UseSplitVerifier = true

使用新的Class类型校验器(依赖StackMapTable信息的类型检查),以加快字节码校验速度,建议启用。

FailOverToOldVerifier = true

当类型校验失败时,回到老的类型推导校验方式进行校验。建议关闭。

RelaxAccessControlCheck = false

在校验阶段放松对类型访问性的限制。建议关闭。

多线程相关参数

UseBiasedLocking = true

使用偏向锁,它通过消除资源无竞争情况下的同步原语,进一步提高了程序的运行性能。

UseSpinning = false

使用自旋锁以避免线程频繁的挂起和唤醒,建议开启

PreBlockSpin = 10

在挂起线程前,使用自旋锁时的最大自旋次数,超过这个次数后,线程将被挂起

UseThreadPriorities = true

使用线程优先级

UseFastAccessorMethods = true

当频繁反射执行某个方法时,编译成字节码来加快反射的执行速度

性能参数

AggressiveOpts = false

使用比较激进的优化特性,这些特性具有双重影响,并不一定能够加速应用的执行

UseLargePages = false

使用大的内存页,需要操作系统内核的支持。在大内存的机器上建议开启

LargePageSizeInBytes = 0

设置堆内存的内存页大小,一般是4M,需要操作系统内核的支持

调试参数

PrintCommandLineFlags = false

打印当前启用的非稳态选项

PrintFlagsFinal = false

输出所有不稳定选项的名称及其当前值

PrintGCTimeStamps = false

打印每次回收开始时间的时间戳,对于查看垃圾回收频率非常有用。

ErrorFile =

如果JVM崩溃,则将错误日志输出到指定的文件路径。

HeapDumpPath =

当java进程因OutOfMemory或crash被OS强制终止后,生成一个Heap Profling格式的堆内存快照文件。

以上是 HotSpot 选项笔记 的全部内容, 来源链接: utcz.com/z/264655.html

回到顶部