目录
一些有用的-XX选项
对于带有-server的Solaris Sparc,Java SE 6列出了缺省值。某些选项可能因架构/ OS / JVM版本而异。描述中列出了具有不同默认值的平台。
-XX:+<option>使用-XX:-<option>.Disa 打开和关闭布尔选项- 数字选项设置为
-XX:<option>=<number>。数字可以包括兆字节的“m”或“M”,千字节的“k”或“K”以及千兆字节的“g”或“G”(例如,32k与32768相同)。 - 字符串选项设置有
-XX:<option>=<string>,通常用于指定文件,路径或命令列表
标记为可管理的标志可通过JDK管理界面(com.sun.management.HotSpotDiagnosticMXBean API)以及JConsole动态写入。在监视和管理Java SE 6平台应用程序中,可管理标志也可以通过jinfo -flag设置。
以下选项分为不同类别。
- 行为选项会更改VM的基本行为。
- 垃圾优先(G1)垃圾收集选项
- 性能调整选项是旋钮,可用于调整VM性能。
- 调试选项通常可以跟踪,打印或输出VM信息。
行为选择
| 选项和默认值 | 描述 |
|---|---|
| -XX:-AllowUserSignalHandlers | 如果应用程序安装了信号处理程序,请不要抱怨。(仅与Solaris和Linux相关。) |
| -XX:AltStackSize = 16384 | 备用信号堆栈大小(以千字节为单位)。(仅与Solaris相关,从5.0中删除。) |
| -XX:-DisableExplicitGC | 默认情况下,启用对System.gc()的调用(-XX:-DisableExplicitGC)。使用-XX:+ DisableExplicitGC禁用对System.gc()的调用。请注意,JVM在必要时仍会执行垃圾回收。 |
| -XX:+ FailOverToOldVerifier | 新类型检查程序失败时故障转移到旧验证程序。(在6中引入) |
| -XX:+ HandlePromotionFailure | 最年轻的一代系列不需要保证所有活动对象的完全升级。(在1.4.2更新11中引入)[5.0及更早版本:false。] |
| -XX:+ MaxFDLimit | 将文件描述符的数量转换为最大值。(仅与Solaris相关。) |
| -XX:PreBlockSpin = 10 | 用于-XX的旋转计数变量:+ UseSpinning。控制在输入操作系统线程同步代码之前允许的最大旋转迭代。(在1.4.2中引入。) |
| -XX:-RelaxAccessControlCheck | 放宽验证程序中的访问控制检查。(在6中引入) |
| -XX:+ ScavengeBeforeFullGC | 在完整GC之前进行年轻一代GC。(在1.4.1中介绍。) |
| -XX:+ UseAltSigs | 对于VM内部信号,使用备用信号而不是SIGUSR1和SIGUSR2。(在1.3.1更新9中引入,1.4.1。仅与Solaris相关。) |
| -XX:+ UseBoundThreads | 将用户级线程绑定到内核线程。(仅与Solaris相关。) |
| -XX:-UseConcMarkSweepGC | 为旧一代使用并发标记扫描集合。(在1.4.1中引入) |
| -XX:+ UseGCOverheadLimit | 使用策略限制在引发OutOfMemory错误之前在GC中花费的VM时间的比例。(在6中引入) |
| -XX:+ UseLWPSynchronization | 使用基于LWP而不是基于线程的同步。(在1.4.0中引入。仅与Solaris相关。) |
| -XX:-UseParallelGC | 使用并行垃圾收集清除。(在1.4.1中引入) |
| -XX:-UseParallelOldGC | 对完整集合使用并行垃圾回收。启用此选项会自动设置-XX:+ UseParallelGC。(在5.0更新中引入6.) |
| -XX:-UseSerialGC | 使用串行垃圾收集。(5.0中引入。) |
| -XX:-UseSpinning | 在进入操作系统线程同步代码之前,在Java监视器上启用朴素旋转。(仅与1.4.2和5.0相关。)[1.4.2,多处理器Windows平台:true] |
| -XX:+ UseTLAB | 使用线程局部对象分配(在1.4.0中引入,在此之前称为UseTLE。)[1.4.2和更早版本,x86或使用-client:false] |
| -XX:+ UseSplitVerifier | 使用具有StackMapTable属性的新类型检查器。(在5.0中引入。)[5.0:false] |
| -XX:+ UseThreadPriorities | 使用本机线程优先级。 |
| -XX:+ UseVMInterruptibleIO | 在EINTR之前或与EINTR进行I / O操作的线程中断导致OS_INTRPT。(仅在Solaris中引入。仅与Solaris相关。) |
垃圾优先(G1)垃圾收集选项
| 选项和默认值 | 描述 |
|---|---|
| -XX:+ UseG1GC | 使用垃圾优先(G1)收集器 |
| -XX:MaxGCPauseMillis =n | 设置最大GC暂停时间的目标。这是一个软目标,JVM将尽最大努力实现它。 |
| -XX:InitiatingHeapOccupancyPercent = n | 启动并发GC循环的(整个)堆占用百分比。它由GC使用,它基于整个堆的占用而不仅仅是其中一代(例如,G1)触发并发GC循环。值0表示“执行恒定GC循环”。默认值为45。 |
| -XX:NewRatio =n | 旧/新一代尺寸的比例。默认值为2。 |
| -XX:SurvivorRatio =n | 伊甸园/幸存者空间大小的比率。默认值为8。 |
| -XX:MaxTenuringThreshold =n | 终身临界值的最大值。默认值为15。 |
| -XX:ParallelGCThreads =n | 设置垃圾收集器并行阶段使用的线程数。默认值因运行JVM的平台而异。 |
| -XX:ConcGCThreads =n | 并发垃圾收集器将使用的线程数。默认值因运行JVM的平台而异。 |
| -XX:G1ReservePercent = n | 设置保留为false上限的堆的数量,以减少促销失败的可能性。默认值为10。 |
| -XX:G1HeapRegionSize = n | 使用G1,Java堆被细分为大小均匀的区域。这设置了各个子部门的大小。根据堆大小,符合人体工程学地确定此参数的默认值。最小值为1Mb,最大值为32Mb。 |
性能选项
| 选项和默认值 | 描述 |
|---|---|
| -XX:+ AggressiveOpts | 打开预期在即将发布的版本中默认的点性能编译器优化。(在5.0更新中引入6.) |
| -XX:CompileThreshold = 10000 | 编译前的方法调用/分支数[-client:1,500] |
| -XX:LargePageSizeInBytes =4米 | 设置用于Java堆的大页面大小。(在1.4.0更新1中引入。)[amd64:2m。] |
| -XX:MaxHeapFreeRatio = 70 | GC后最大堆积空闲百分比以避免收缩。 |
| -XX:MaxNewSize =大小 | 新一代的最大大小(以字节为单位)。从1.4开始,MaxNewSize被计算为NewRatio的函数。[1.3.1 Sparc:32m; 1.3.1 x86:2.5米。] |
| -XX:MaxPermSize =64米 | 永久代的大小。[5.0及更新版本:64位虚拟机缩放30%; 1.4 amd64:96m; 1.3.1 -client:32m。] |
| -XX:MinHeapFreeRatio = 40 | GC后最小的堆积百分比以避免扩展。 |
| -XX:NewRatio = 2 | 旧/新一代尺寸的比例。[Sparc -client:8; x86 -server:8; x86 -client:12。] - 客户端:4(1.3)8(1.3.1 +),x86:12] |
| -XX:NewSize= 2 | 新一代的默认大小(以字节为单位)[5.0及更新版本:64位虚拟机缩放30%; x86:1米; x86,5.0及更早版本:640k] |
| -XX:ReservedCodeCacheSize =32米 | 保留代码缓存大小(以字节为单位) - 最大代码缓存大小。[Solaris 64位,amd64和-server x86:2048m; 在1.5.0_06及更早版本中,Solaris 64位和amd64:1024m。 |
| -XX:SurvivorRatio = 8 | 伊甸园/幸存者空间大小的比例[Solaris amd64:6;Sparc在1.3.1:25; 5.0及更早版本中的其他Solaris平台:32] |
| -XX:TargetSurvivorRatio = 50 | 清除后使用的幸存者空间的所需百分比。 |
| -XX:ThreadStackSize = 512 | 线程堆栈大小(以KB为单位)。(0表示使用默认堆栈大小)[Sparc:512; Solaris x86:320(在5.0及更早版本中为256之前的版本); Sparc 64位:1024;Linux amd64:1024(5.0及更早版本中为0); 所有其他的0.] |
| -XX:+ UseBiasedLocking | 启用偏置锁定。有关更多详细信息,请参阅此调整示例。(在5.0更新中引入6.)[5.0:false] |
| -XX:+ UseFastAccessorMethods | 使用优化版本的Get Field。 |
| -XX:-UseISM | 使用亲密共享内存。[不适用于非Solaris平台。]有关详细信息,请参阅私密共享内存。 |
| -XX:+ UseLargePages | 使用大页面内存。(在5.0更新5中引入。)有关详细信息,请参阅Java支持大内存页面。 |
| -XX:+ UseMPSS | 使用具有4mb页面的多页面大小支持。不要与ISM一起使用,因为这取代了对ISM的需求。(在1.4.0更新1中引入,与Solaris 9及更新版本相关。)[1.4.1及更早版本:false] |
| -XX:+ UseStringCache | 启用常用分配字符串的缓存。 |
| -XX:AllocatePrefetchLines = 1 | 使用JIT编译代码中生成的预取指令在最后一次对象分配后加载的高速缓存行数。如果最后分配的对象是实例,则默认值为1;如果是数组,则默认值为3。 |
| -XX:AllocatePrefetchStyle = 1 | 生成预取指令的代码样式。 0 - 没有生成预取指令* d *, 1 - 在每次分配后执行预取指令, 2 - 在执行预取指令时使用TLAB分配水印指针到门。 |
| -XX:+ UseCompressedStrings | 对字符串使用byte [],可以表示为纯ASCII。(在Java 6 Update 21性能发布中引入) |
| -XX:+ OptimizeStringConcat | 尽可能优化字符串连接操作。(在Java 6 Update 20中引入) |
调试选项
| 选项和默认值 | 描述 |
|---|---|
| -XX:-CITime | 打印在JIT编译器中花费的时间。(在1.4.0中引入。) |
| -XX:ErrorFile= / hs_err_pid .log中 | 如果发生错误,请将错误数据保存到此文件中。(在6中引入) |
| -XX:-ExtendedDTraceProbes | 启用影响性能的dtrace探针。(仅在Solaris中引入。仅与Solaris相关。) |
| -XX:HeapDumpPath = / java_pid .hprof | 堆转储的目录或文件名的路径。可管理。(在1.4.2更新12,5.0更新7中引入。) |
| -XX:-HeapDumpOnOutOfMemoryError | 抛出java.lang.OutOfMemoryError时转储堆到文件。可管理。(在1.4.2更新12,5.0更新7中引入。) |
| -XX:OnError =“; ” | 在致命错误上运行用户定义的命令。(在1.4.2更新9中引入) |
| -XX:OnOutOfMemoryError =“; ” | 首次抛出OutOfMemoryError时运行用户定义的命令。(在1.4.2更新12,6中引入) |
| -XX:-PrintClassHistogram | 在Ctrl-Break上打印类实例的直方图。可管理。(在1.4.2中引入。)jmap -histo命令提供了等效的功能。 |
| -XX:-PrintConcurrentLocks | 在Ctrl-Break线程转储中打印java.util.concurrent锁。可管理。(在6.中引入)jstack -l命令提供等效功能。 |
| -XX:-PrintCommandLineFlags | 打印出现在命令行上的标志。(5.0中引入。) |
| -XX:-PrintCompilation | 编译方法时打印消息。 |
| -XX:-PrintGC | 在垃圾收集中打印消息。可管理。 |
| -XX:-PrintGCDetails | 在垃圾收集中打印更多细节。可管理。(在1.4.0中引入。) |
| -XX:-PrintGCTimeStamps | 打印垃圾回收时的时间戳。可管理(1.4.0中引入) |
| -XX:-PrintTenuringDistribution | 打印终身年龄信息。 |
| -XX:-PrintAdaptiveSizePolicy | 允许打印有关自适应生成大小的信息。 |
| -XX:-TraceClassLoading | 跟踪类的加载。 |
| -XX:-TraceClassLoadingPreorder | 跟踪按引用顺序(未加载)加载的所有类。(在1.4.2中引入。) |
| -XX:-TraceClassResolution | 跟踪常量池分辨率。(在1.4.2中引入。) |
| -XX:-TraceClassUnloading | 跟踪卸载类。 |
| -XX:-TraceLoaderConstraints | 跟踪记录装载机约束。(在6中引入) |
| -XX:+ PerfDataSaveToFile | 退出时保存jvmstat二进制数据。 |
| -XX:ParallelGCThreads =n | 设置年轻和旧的并行垃圾收集器中的垃圾收集线程数。默认值因运行JVM的平台而异。 |
| -XX:+ UseCompressedOops | 允许使用压缩指针(对象引用表示为32位偏移而不是64位指针),以优化64位性能,Java堆大小小于32gb。 |
| -XX:+ AlwaysPreTouch | 在JVM初始化期间预先触摸Java堆。因此,堆的每个页面在初始化期间都是需求归零,而不是在应用程序执行期间递增。 |
| -XX:AllocatePrefetchDistance =n | 设置对象分配的预取距离。将使用新对象的值写入的内存以超出最后分配的对象的地址的距离(以字节为单位)预取到高速缓存中。每个Java线程都有自己的分配点。默认值因运行JVM的平台而异。 |
| -XX:InlineSmallCode =n | 仅当先前编译的方法生成的本机代码大小小于此值时,才对其进行内联。默认值因运行JVM的平台而异。 |
| -XX:MaxInlineSize = 35 | 要内联的方法的最大字节码大小。 |
| -XX:FreqInlineSize =n | 要内联的频繁执行方法的最大字节码大小。默认值因运行JVM的平台而异。 |
| -XX:LoopUnrollLimit =n | 展开循环体,服务器编译器中间表示节点计数小于此值。服务器编译器使用的限制是此值的函数,而不是实际值。默认值因运行JVM的平台而异。 |
| -XX:InitialTenuringThreshold = 7 | 设置用于并行年轻收集器中自适应GC大小调整的初始时效阈值。终结阈值是对象在被提升为旧的或终身的一代之前在年轻的集合中存活的次数。 |
| -XX:MaxTenuringThreshold =n | 设置用于自适应GC大小调整的最大暂定阈值。当前最大值为15.并行收集器的默认值为15,CMS为默认值。 |
| -Xloggc:<文件名> | 将GC详细输出记录到指定文件。详细输出由正常的详细GC标志控制。 |
| -XX:-UseGCLogFileRotation | 启用GC日志轮换,需要-Xloggc。 |
| -XX:NumberOfGClogFiles = 1 | 设置旋转日志时要使用的文件数,必须> = 1.旋转的日志文件将使用以下命名方案, .0, .1,..., .n- 1。 |
| -XX:GCLogFileSize = 8K | 日志将在何时旋转日志文件的大小必须> = 8K。 |
这些就是 jvm 可以调节的全部选项了
ok
新版本的一些缩写
| 参数名称 | 含义 默认值 |
|---|---|
| -Xms | 初始堆大小 物理内存的1/64(<1GB) 默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制. |
| -Xmx | 最大堆大小 物理内存的1/4(<1GB) 默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制 |
| -Xmn | 年轻代大小(1.4or lator)注意:此处的大小是(eden+ 2 survivor space).与jmap -heap中显示的New gen是不同的。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小.增大年轻代后,将会减小年老代大小.此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8 |
| -XX:NewSize | 设置年轻代大小(for 1.3/1.4) |
| -XX:MaxNewSize | 年轻代最大值(for 1.3/1.4) |
| -XX:PermSize | 设置持久代(perm gen)初始值 物理内存的1/64 |
| -XX:MaxPermSize | 设置持久代最大值 物理内存的1/4 |
| -Xss | 每个线程的堆栈大小,JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K.更具应用的线程所需内存大小进行 调整.在相同物理内存下,减小这个值能生成更多的线程.但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右,一般小的应用, 如果栈不是很深, 应该是128k够用的 大的应用建议使用256k。这个选项对性能影响比较大,需要严格的测试。(校长)和threadstacksize选项解释很类似,官方文档似乎没有解释,在论坛中有这样一句话:"”-Xss is translated in a VM flag named ThreadStackSize”一般设置这个值就可以了。 |
| -XX:ThreadStackSize | Thread Stack Size (0 means use default stack size) [Sparc: 512; Solaris x86: 320 (was 256 prior in 5.0 and earlier); Sparc 64 bit: 1024; Linux amd64: 1024 (was 0 in 5.0 and earlier); all others 0.] |
| -XX:NewRatio | 年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代) -XX:NewRatio=4表示年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5Xms=Xmx并且设置了Xmn的情况下,该参数不需要进行设置。 |
| -XX:SurvivorRatio | Eden区与Survivor区的大小比值 设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10 |
| -XX:LargePageSizeInBytes | 内存页的大小不可设置过大, 会影响Perm的大小 =128m |
| -XX:+UseFastAccessorMethods | 原始类型的快速优化 |
| -XX:+DisableExplicitGC | 关闭System.gc() 这个参数需要严格的测试 |
| -XX:MaxTenuringThreshold | 垃圾最大年龄 如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代. 对于年老代比较多的应用,可以提高效率.如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活 时间,增加在年轻代即被回收的概率,该参数只有在串行GC时才有效. |
| -XX:+AggressiveOpts | 加快编译 |
| -XX:+UseBiasedLocking | 锁机制的性能改善 |
| -Xnoclassgc | 禁用垃圾回收 |
| -XX:SoftRefLRUPolicyMSPerMB | 每兆堆空闲空间中SoftReference的存活时间 1s softly reachable objects will remain alive for some amount of time after the last time they were referenced. The default value is one second of lifetime per free megabyte in the heap |
| -XX:PretenureSizeThreshold | 对象超过多大是直接在旧生代分配 0 单位字节 新生代采用Parallel Scavenge GC时无效,另一种直接在旧生代分配的情况是大的数组对象,且数组中无外部引用对象. |
| -XX:TLABWasteTargetPercent | TLAB占eden区的百分比 1% |
| -XX:+CollectGen0First | FullGC时是否先YGC false |
ok
nohup部署命令
$ java -jar -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms1024m -Xmx1024m -Xmn256m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC xxooporject-1.0.0.jar
- $ java -jar -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms1024m -Xmx1024m -Xmn256m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC xxooporject-1.0.0.jar
介绍
-XX:MetaspaceSize=128m (元空间默认大小)
-XX:MaxMetaspaceSize=128m (元空间最大大小)
-Xms1024m (堆最大大小)
-Xmx1024m (堆默认大小)
-Xmn256m (新生代大小)
-Xss256k (棧最大深度大小)
-XX:SurvivorRatio=8 (新生代分区比例 8:2)
-XX:+UseConcMarkSweepGC (指定使用的垃圾收集器,这里使用CMS收集器)
-XX:+PrintGCDetails (打印详细的GC日志)
版本改变
JDK8之后把-XX:PermSize 和 -XX:MaxPermGen移除了,取而代之的是
-XX:MetaspaceSize=128m (元空间默认大小)
-XX:MaxMetaspaceSize=128m (元空间最大大小)
JDK 8开始把类的元数据放到本地化的堆内存(native heap)中,这一块区域就叫Metaspace,中文名叫元空间。
使用本地化的内存有什么好处呢?最直接的表现就是java.lang.OutOfMemoryError: PermGen 空间问题将不复存在,因为默认的类的元数据分配只受本地内存大小的限制,也就是说本地内存剩余多少,理论上Metaspace就可以有多大(貌似容量还与操作系统的虚拟内存有关?这里不太清楚),这解决了空间不足的问题。不过,让Metaspace变得无限大显然是不现实的,因此我们也要限制Metaspace的大小:使用-XX:MaxMetaspaceSize参数来指定Metaspace区域的大小。JVM默认在运行时根据需要动态地设置MaxMetaspaceSize的大小。
持续更新