Java命令选项与JVM参数配置
个人博客原文链接: Java命令选项与JVM参数配置
官方文档链接:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
1.标准选项
所有JVM实现都支持的最常用选项。
用法: java [-options] class [args...]
(执行类)
或 java [-options] -jar jarfile [args...]
(执行 jar 文件)
其中选项包括:
-d32
:在32位环境中运行应用程序。如果未安装或不支持32位环境,则会报告错误。
-d64
:在64位环境中运行应用程序。如果未安装或不支持64位环境,则会报告错误。
-server
:选择 “server” 模式。默认 VM 是 server,在服务器类计算机上运行。
-client
:选择 “client” 模式。
-cp <目录>
和-classpath <目录>
:类搜索路径,用":"分隔的目录,JAR 包,ZIP。
-D<名称>=<值>
: 设置系统属性。
-verbose:[class|gc|jni]
:启用详细输出(class,gc,jni)。
-X
:输出非标准选项的帮助。
-ea[:<packagename>...|:<classname>]
和-enableassertions[:<packagename>...|:<classname>]
:按指定的粒度启用断言。
-da[:<packagename>...|:<classname>]
和-disableassertions[:<packagename>...|:<classname>]
:禁用具有指定粒度的断言。
-version
:输出产品版本并退出。
-esa | -enablesystemassertions
:启用系统断言。
-dsa | -disablesystemassertions
:禁用系统断言。
-agentlib:<libname>[=<选项>]
:加载本机代理库 <libname>
, 例如 -agentlib:hprof。
-agentpath:<pathname>[=<选项>]
:按完整路径名加载本机代理库。
-javaagent:<jarpath>[=<选项>]
:加载 Java 编程语言代理。
2.非标准参数
该选项作用于特定的虚拟机。
-Xmixed
:混合模式执行 (默认)。
-Xint
:仅解释模式执行。
-Xbootclasspath:<用:分隔的目录和 zip/jar 文件>
:设置搜索路径以搜索引导类文件。这些文件用于代替JDK中包含的引导类文件
-Xbootclasspath/a:<用:分隔的目录和 zip/jar 文件>
:附加在引导类路径末尾。
-Xbootclasspath/p:<用:分隔的目录和 zip/jar 文件>
:置于引导类路径之前。
-Xdiag
:显示附加诊断消息。
-Xnoclassgc
:禁用类垃圾收集。
-Xincgc
:启用增量垃圾收集。
-Xloggc:<file>
:将 GC 状态记录在文件中 (带时间戳)。
-
# 设置日志目录和日志名称,%t表示日志文件生成时间 -Xloggc:/opt/app/gc-%t.log
-Xbatch
:禁用后台编译。
-Xms<size>
:设置初始 Java 堆大小(无单位默认为字节,可附单位k,m,g)。
-
-Xms6291456 -Xms6144k -Xms6m
-Xmx<size>
:设置最大 Java 堆大小。
-Xss<size>
:设置 Java 线程堆栈大小。
-Xprof
:分析正在运行的程序,并将分析数据发送到标准输出。
-Xfuture
:启启用严格的类文件格式检查,强制严格遵守类文件格式规范。
-Xrs
:减少 Java/VM 对操作系统信号的使用。
-Xcheck
:对 JNI 函数执行其他检查。
-Xshare:mode
:设置类数据共享(CDS)模式,此选项的可能模式参数包括以下内容:
off
on
off
:此选项位默认值dump
-XshowSettings:category
:显示所有设置并继续。
all
:显示所有设置并继续,默认值vm
:显示所有与 vm 相关的设置并继续properties
:显示所有属性设置并继续locale
:显示所有与区域设置相关的设置并继续
-Xmaxjitcodesize=size
:指定JIT编译代码的最大代码缓存大小(以字节为单位)。默认为240 MB。
-Xss<size>
:设置线程堆栈大小(以字节为单位),默认值取决于平台。
- Linux/ARM (32-bit): 320 KB
- Linux/i386 (32-bit): 320 KB
- Linux/x64 (64-bit): 1024 KB
- macOS (64-bit): 1024 KB
- Oracle Solaris/i386 (32-bit): 320 KB
- Oracle Solaris/x64 (64-bit): 1024 KB
- Windows: The default value depends on virtual memory
3.高级运行时参数
控制着HotSpot VM的运行时行为。
-XX:+DisableAttachMechanism
:启用禁用允许工具连接到JVM的机制的选项。默认情况下,此选项处于禁用状态,这意味着连接机制已启用,您可以使用jcmd、jstack、jmap和jinfo等工具。
-XX:ErrorFile=filename
:指定发生不可恢复错误时写入错误数据的路径和文件名。
-XX:+/-FlightRecorder
:开启或者关闭 Java飞行记录器(JFR)。
-XX:FlightRecorderOptions=[parameter=value,]
:控制JFR行为的参数。可用的JFR参数如下:
-
defaultrecording={true|false}
:启动持续记录Java应用程序,默认为false。 -
disk={true|false}
:是否将临时数据写入磁盘存储。 -
dumponexit={true|false}
:JVM以被控制工具终止时是否应生成JFR数据的转储文件。默认情况下,此参数设置为false(退出时不生成转储文件)。 -
dumponexitpath=path
:JFR数据的转储文件的存储路径,此参数与dumponexit=true搭配使用。 -
globalbuffersize=size
:定义数据保留的内存大小,默认为 462848 bytes。 -
loglevel={quiet|error|warning|info|debug|trace}
:JFR的日志文件写入日志的级别,默认为info。 -
maxage=time
:默认记录中要保留的磁盘数据的最大年龄。指定时间单位s,m,h,d。 -
maxchunksize=size
:记录中数据块的最大大小(以字节为单位)。 -
maxsize=size
:默认记录中磁盘数据的最大大小。 -
repository=path
:临时磁盘存储的存储库(目录)。 -
samplethreads={true|false}
:是否启用线程采样。只有当采样事件与此参数一起启用时,才会发生线程采样。默认情况下,此参数处于启用状态。 -
settings=path
:事件设置文件(JFC类型)的路径和名称。默认情况下,使用default.jfc文件,该文件位于JAVA_HOME/jre/lib/jfr中。 -
stackdepth=depth
:JFR堆栈跟踪的堆栈深度。默认情况下,深度设置为64个方法调用。最大值为2048,最小值为1。 -
threadbuffersize=size
:每个线程的本地缓冲区大小(以字节为单位)。示例:指定JFR将连续记录写入磁盘,并将数据块的最大大小设置为10 MB:
-XX:FlightRecorderOptions=defaultrecording=true,disk=true,maxchunksize=10M
-XX:MaxDirectMemorySize=size
:设置新I/O(java.nio包)直接缓冲区分配的最大总大小。
-XX:OnError=string
:设置一个自定义命令或一系列以分号分隔的命令,以便在发生不可恢复的错误时运行。
-XX:OnOutOfMemoryError=string
:设置一个自定义命令或一系列以分号分隔的命令,以便在发生OutOfMemory异常时运行。
-XX:+PerfDataSaveToFile
:如果启用,则在Java应用程序退出时保存jstat二进制数据。
-XX:StartFlightRecording=[parameter=value,]
:开启 Java飞行记录器。
compress={true|false}
:是否使用gzip文件压缩实用程序压缩磁盘上的JFR记录日志文件(JFR类型)。仅当指定了filename参数时,此参数才有效。defaultrecording={true|false}
:录制是连续的背景录制还是在有限的时间内运行,默认为false。delay=time
:Java应用程序启动时间和录制开始之间的延迟时间。dumponexit={true|false}
:JVM以受控方式终止时是否应生成JFR数据的转储文件。duration=time
:录制的持续时间。filename=path
:JFR记录日志文件的路径和名称。name=identifier
:JFR记录的标识符。maxage=time
:记录中要保留的磁盘数据的最大年龄。maxsize=size
:默认录制时要保留的磁盘数据的最大大小(以字节为单位)。settings=path
:事件设置文件(JFC类型)的路径和名称。
-XX:ThreadStackSize=size
:Java线程堆栈大小(以k为单位),同-Xss
。
-XX:+TraceClassLoading
:启用类加载时的跟踪。
-XX:+TraceClassLoadingPreorder
:允许按引用顺序跟踪所有加载的类。
-XX:+TraceClassResolution
:启用对常量池的解析(例如符号引用解析为直接引用)。
-XX:+TraceClassUnloading
:启用类卸载时的跟踪。
-XX:+TraceLoaderConstraints
:。
-XX:-UseBiasedLocking
:禁用偏向锁。
-XX:-UseCompressedOops
:禁用压缩指针。
4.高级服务能力参数
提供收集系统信息和执行调试的能力。
-XX:+HeapDumpOnOutOfMemoryError
:当java.lang.OutOfMemoryError发生时,将heap内存dump到当前目录的一个文件。默认是不开启的。
-XX:HeapDumpPath=path
:设置在dump heap时将文件dump到哪里。默认是当前目录下 java_pidpid.hprof这样形式的文件。
-XX:LogFile=path
:指定日志数据被记录在哪里,默认是在当前目录的hotspot.log下。
-XX:+PrintClassHistogram
:允许在Control+C事件(SIGTERM)后打印类实例直方图。。
-XX:+PrintConcurrentLocks
:允许在Control+C事件(SIGTERM)后打印java.util.并发锁。
5.高级垃圾回收参数
控制 HotSpot VM如何执行垃圾收集
-XX:NewRatio=ratio
:设置年轻代和年老代的比例,默认是2。
-XX:NewSize=size
:设置初始的年轻代的大小。年轻代是分配新对象的地方,是 GC经常发生的地方。设置太低,会频繁minor GC,设置太高的话就只会发生Full GC了。Oracle推荐设置为整体内存的一半或者1/4。该参数等价于-Xmn。
-XX:SurvivorRatio=ratio
:eden区和survivor区的比例。默认是8。
-XX:MaxMetaspaceSize=size
:为类的元数据进行分配的metaspace最大native内存大小,默认情况这个值无限制。该值依赖于当前的JVM、其他在运行的JVM和系统可用内存。
-XX:MaxTenuringThreshold=threshold
:垃圾最大年龄,设置在自适应GC大小的使用占有最大阈值,默认对于parallel(throughput)的是15,对于CMS的是6。
-XX:MetaspaceSize=size
:设置一个metaspace的大小,第一次超出该分配后会触发GC。
-XX:MaxHeapSize=size
:设置最大堆大小,这个值需要大于2MB,且是1024的整数倍。等价于-Xmx
-XX:MaxNewSize=size
:设置最大的年轻代的堆大小。
-XX:+PrintGC
:打印gc信息。
-XX:+PrintGCDetails
:打印详细的gc信息。
-XX:+PrintHeapAtGC
:在进行GC的前后打印出堆的信息。
-XX:+PrintGCApplicationStoppedTime
:打印GC暂停的时间长度。
-XX:+PrintGCApplicationConcurrentTime
:打印自上次暂停(例如GC暂停)以来经过的时间。
-XX:+PrintGCDateStamps
:打印每个GC的日期时间戳。默认不打印。
-XX:+PrintGCTimeStamps
:打印每个GC的时间戳。默认不打印。
-XX:+PrintTenuringDistribution
:打印所在的年龄代的信息。
-XX:+UseGCLogFileRotation
:开启滚动生成日志,配合-Xloggc参数使用。默认不开启。
-XX:NumberOfGCLogFiles=<num>
:滚动GC日志文件数,默认0,不滚动。
-XX:GCLogFileSize=<size>
:GC文件滚动大小,需开启UseGCLogFileRotation。
-XX:+ScavengeBeforeFullGC
:在每次Full GC前做一次年轻代的GC。该项默认是开启的。
-XX:MaxHeapFreeRatio=percent
:设置在一次GC后最大的堆空闲空间占比。如果空闲堆空间超过这个值,堆空间会被收缩。默认是70%。
-XX:MinHeapFreeRatio=percent
:设置在一次GC后最小的空闲堆内存占比。如果空闲堆内存小于该值,则堆内存扩展。默认是40%。
-XX:+UseConcMarkSweepGC
:设置让CMS也支持老年代的回收。默认是不开启的,如果开启,那么-XX:+UseParNewGC也会自动被设置。Java 8 不支持-XX:+UseConcMarkSweepGC -XX:-UseParNewGC这种组合。
-XX:+CMSClassUnloadingEnabled
:支持CMS垃圾回收下的类卸载。默认是开启的。
-XX:CMSInitiatingOccupancyFraction=percent
:设置一个年老代的占比,达到多少会触发CMS回收。默认是-1,任何一个负值的设定都表示了用-XX:CMSTriggerRatio来做真实的初始化值。
-XX:+CMSScavengeBeforeRemark
:开启功能在CMSremark前进行Scavenge。默认是关闭的。
-XX:CMSTriggerRatio=percent
:设置一个在CMS开始前的内存的触发百分比,针对的是由-XX:MinHeapFreeRatio分配的内存。默认是80。
-XX:ConcGCThreads=threads
:设置支持并发GC的线程数。默认值依赖于给JVM的CPU数目
-XX:+DisableExplicitGC
:关闭显式GC调用,即关闭System.gc()。
-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses
:支持通过**System.gc()**来做并发的GC并且卸载类。默认是不支持的。该参数一定要和-XX:+UseConcMarkSweepGC一起使用。
-XX:+UseG1GC
:设置使用G1作为GC收集器。G1比较推荐在大堆应用场景下使用(大于6GB)。
-XX:G1HeapRegionSize=size
:设置在使用G1收集器时Java堆被划分为子区域的大小。在1MB到32MB之间,默认会根据Java堆的大小自动检测。
-XX:+G1PrintHeapRegions
:打印出哪些region是被分配的,哪些是被G1取回的。默认是关闭打印的。
-XX:G1ReservePercent=percent
:设置一个堆内存的百分比用来作为false ceiling,从而降低使用G1时晋升失败的可能性。默认是10%。
-XX:+UseStringDeduplication
:支持string的去重存储。默认关闭,要使用该选项,必须使用G1垃圾回收器-XX:+UseG1GC。
-XX:MaxGCPauseMillis=time
:设置一个最大的GC停顿时间(毫秒),这是个软目标,JVM会尽最大努力去实现它,默认没有最大值设置。
-XX:ParallelGCThreads=threads
:并行GC时的线程数。
-XX:+ParallelRefProcEnabled
:是否支持并发引用处理,默认是关闭的。
-XX:+PrintAdaptiveSizePolicy
:打印自适应调整策略。默认关闭。
-XX:StringDeduplicationAgeThreshold=threshold
:string对象到达特定的age后会去除重复数据。默认是3,jvm中每次gc后存活的对象,age会加一。string对象在晋升为年老代之前都是去除重复数据的候选对象。
-XX:+UseAdaptiveSizePolicy
:使用自适应分代大小。默认是开启的。
-XX:TLABSize=size
:设置thread-local allocation buffer (TLAB)的初始化大小。
-XX:TargetSurvivorRatio=percent
:设置在YGC后的期望的survivor空间占比。默认是50%。
-XX:+UseGCOverheadLimit
:设置一种策略用来设置一个时间比率来限制在OOM之前的GC时间。默认是开启的,并行GC时如果有多于98%以上的时间用来gc就会抛出OOM。当堆空间较小时这个参数有助于保护应用程序不至于长时间的停顿没有进展。
-XX:+UseNUMA
:使用NUMA[5]开启性能优化。默认不开启,该项只有在开启了-XX:+UseParallelGC后才有效。
-XX:+UseParallelGC
:支持并行的垃圾收集器,即throughput垃圾收集。这可以在多核处理器下提升垃圾收集性能。默认不开启,收集器由系统根据JVM和机器配置自动选择。开启后-XX:+UseParallelOldGC选项也自动开启。
-XX:+UseParallelOldGC
:支持FULL GC的并行收集器。默认不开启。
-XX:+UseParNewGC
:支持在年轻代用多线程进行垃圾收集。默认不开启,使用-XX:+UseConcMarkSweepGC时会自动被开启。
-XX:+UseSerialGC
:支持使用串行收集器。默认不开启。