JVM参数设置大全

JVM命令行选项主要有3类:标准选项(eg:-client)、非标准选项(eg:-Xmxsize)、非稳定选项(eg:-XX:+AggressiveOpts)。选项使用说明: 
-XX:+option 启用选项 
-XX:-option 不启用选项 
-XX:option=number 给选项设置一个数字类型值,可跟单位,例如 128k, 256m, 1g 
-XX:option=string 给选项设置一个字符串值,例如
-XX:HeapDumpPath=./dump.core

JVM参数设置说明

参数名称

含义

默认值


-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/5
Xms=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


并行收集器相关参数

-XX:+UseParallelGC

Full GC采用parallel MSC
(此项待验证)


选择垃圾收集器为并行收集器.此配置仅对年轻代有效.即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集.(此项待验证)

-XX:+UseParNewGC

设置年轻代为并行收集


可与CMS收集同时使用
JDK5.0以上,JVM会根据系统配置自行设置,所以无需再设置此值

-XX:ParallelGCThreads

并行收集器的线程数


此值最好配置与处理器数目相等 同样适用于CMS

-XX:+UseParallelOldGC

年老代垃圾收集方式为并行收集(Parallel Compacting)


这个是JAVA 6出现的参数选项

-XX:MaxGCPauseMillis

每次年轻代垃圾回收的最长时间(最大暂停时间)


如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值.

-XX:+UseAdaptiveSizePolicy

自动选择年轻代区大小和相应的Survivor区比例


设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开.

-XX:GCTimeRatio

设置垃圾回收时间占程序运行时间的百分比


公式为1/(1+n)

-XX:+ScavengeBeforeFullGC

Full GC前调用YGC

true

Do young generation GC prior to a full GC. (Introduced in 1.4.1.)

Garbage First (G1)

选项和默认值

描述

-XX:+UseG1GC

使用Garbage First (G1) 收集器

-XX:MaxGCPauseMillis=n

设置最大暂停时间目标。这是软目标,JVM尽力达到这个目标。  


-XX:InitiatingHeapOccupancyPercent=45

整个堆占用多少百分比,开始并发GC周期。整个堆,不是一个代。(例如G1)。0表示恒定GC周期。

-XX:ConcGCThreads=n

并发收集器线程数,默认值随机器变化。

-XX:G1ReservePercent=10

设置预留堆数量,作为false上限,以减少提升失败的几率。

-XX:G1HeapRegionSize=n

使用G1堆被分成相等大小区域。这设置每个区域大小。默认值根据堆大小进行功效学计算出来。最小1M,最大32M

注意:Garbage First (G1)收集器是java6之后加入的。

JVM CMS参数设置


-XX:+UseConcMarkSweepGC

使用CMS内存收集


测试中配置这个以后,-XX:NewRatio=4的配置失效了,原因不明.所以,此时年轻代大小最好用-Xmn设置.???

-XX:+AggressiveHeap



试图是使用大量的物理内存
长时间大内存使用的优化,能检查计算资源(内存, 处理器数量)
至少需要256MB内存
大量的CPU/内存, (在1.4.1在4CPU的机器上已经显示有提升)

-XX:CMSFullGCsBeforeCompaction

多少次后进行内存压缩


由于并发收集器不对内存空间进行压缩,整理,所以运行一段时间以后会产生"碎片",使得运行效率降低.此值设置运行多少次GC以后对内存空间进行压缩,整理.

-XX:+CMSParallelRemarkEnabled

降低标记停顿



-XX+UseCMSCompactAtFullCollection

在FULL GC的时候, 对年老代的压缩


CMS是不会移动内存的, 因此, 这个非常容易产生碎片, 导致内存不够用, 因此, 内存的压缩这个时候就会被启用。 增加这个参数是个好习惯。
可能会影响性能,但是可以消除碎片

-XX:+UseCMSInitiatingOccupancyOnly

使用手动定义初始化定义开始CMS收集


禁止hostspot自行触发CMS GC

-XX:CMSInitiatingOccupancyFraction=70

使用cms作为垃圾回收
使用70%后开始CMS收集

92

为了保证不出现promotion failed(见下面介绍)错误,该值的设置需要满足以下公式CMSInitiatingOccupancyFraction计算公式

-XX:CMSInitiatingPermOccupancyFraction

设置Perm Gen使用到达多少比率时触发

92


-XX:+CMSIncrementalMode

设置为增量模式


用于单CPU情况

-XX:+CMSClassUnloadingEnabled




JVM辅助信息参数设置

-XX:+PrintGC


输出形式:

[GC 118250K->113543K(130112K), 0.0094143 secs]
[Full GC 121376K->10414K(130112K), 0.0650971 secs]

-XX:+PrintGCDetails


输出形式:[GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs]
[GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs]

-XX:+PrintGCTimeStamps



-XX:+PrintGC:PrintGCTimeStamps


可与-XX:+PrintGC -XX:+PrintGCDetails混合使用
输出形式:11.851: [GC 98328K->93620K(130112K), 0.0082960 secs]

-XX:+PrintGCApplicationStoppedTime

打印垃圾回收期间程序暂停的时间.可与上面混合使用

输出形式:Total time for which application threads were stopped: 0.0468229 seconds

-XX:+PrintGCApplicationConcurrentTime

打印每次垃圾回收前,程序未中断的执行时间.可与上面混合使用

输出形式:Application time: 0.5291524 seconds

-XX:+PrintHeapAtGC

打印GC前后的详细堆栈信息


-Xloggc:filename

把相关日志信息记录到文件以便分析.
与上面几个配合使用


-XX:+PrintClassHistogram

garbage collects before printing the histogram.


-XX:+PrintTLAB

查看TLAB空间的使用情况


XX:+PrintTenuringDistribution

查看每次minor GC后新的存活周期的阈值

Desired survivor size 1048576 bytes, new threshold 7 (max 15)
new threshold 7即标识新的存活周期的阈值为7。

调试参数

选项和默认值

描述

-XX:-CITime

打印花费在JIT编译花费的时间Prints time spent in JIT Compiler. (1.4.0引进)

-XX:ErrorFile=./hs_err_pid<pid>.log

如果发生错误,报错错误数据到这个文件(6引入)

-XX:-ExtendedDTraceProbes

驱动性能影响(performance-impacting)动态跟踪探测器 (Introduced in 6引入。只Solaris)

-XX:HeapDumpPath=./java_pid<pid>.hprof

堆转储文件的路径或文件名。可管理 ( 1.4.2 update 12, 5.0 update 7引入)

-XX:HeapDumpOnOutOfMemoryError

OOM时,转储堆文件。可管理 (1.4.2 update 12, 5.0 update 7引入)

-XX:OnError="<cmd args>;<cmd args>"

当发生致命错误时,执行用户定义命令(1.4.2 update 9引入)

-XX:OnOutOfMemoryError="<cmd args>;<cmd args>"

当第一次OOM时执行用户定义命令 ( 1.4.2 update 12, 6引入)

-XX:-PrintClassHistogram

Windowsctrl-breakLinux下是执行kill -3(发送SIGQUIT信号)时,打印class柱状图。jmap -histo提供相同功能(1.4.2引入)

-XX:-PrintConcurrentLocks

Ctrl-Break 打印java.util.concurrent 锁,jstack –l提供相同功能(6引入)

-XX:-PrintCommandLineFlags

打印命令行标记 (5.0引入)

-XX:-PrintCompilation

当一个方法被编译,答应信息

-XX:-PrintGC

GC时,打印信息。

-XX:-PrintGCDetails

GC时打印详细信息 (1.4.0引入)

-XX:-PrintGCTimeStamps

GC时打印时间戳 (1.4.0引入)

-XX:-PrintTenuringDistribution

打印对象存活年龄信息

-XX:-TraceClassLoading

打印类加载

-XX:-TraceClassLoadingPreorder

按照引用顺序打印所有类加载。 (1.4.2引入)

-XX:-TraceClassResolution

打印常量池Trace constant pool resolutions. (1.4.2引入)

-XX:-TraceClassUnloading

打印卸载类

-XX:-TraceLoaderConstraints

打印类加载策略变化 ( 6引入)

-XX:+PerfSaveDataToFile

当推出时,保存jvmstat二进制数据。

-XX:ParallelGCThreads=n

给年轻代和老年代平行垃圾收集器,设置垃圾收集线程数默认值随机器变化

-XX:+UseCompressedOops

开启压缩指针,为了优化java堆小于32G64-bit性能(对象引用指针,32 bit 换成64-bit指针)

-XX:+AlwaysPreTouch

JVM初始化时预先对Java堆进行预先摸底(Pre-touch),堆的每个页初始化时满足需求,而不是应用执行时递增。

-XX:AllocatePrefetchDistance=n

设置对象分配的预取距离。将要写的在这个距离被预抓取到缓存的新对象的内存值。在最后分配的对象地址之前每个java线程有它自己的分配点。默认值随机器变化。

-XX:InlineSmallCode=n

只内联以前编译方法,如果它生成的本地代码大小比这小。默认值随机器变化。

-XX:MaxInlineSize=35

内联方法的最大字节码大小

-XX:FreqInlineSize=n

一个频繁执行的内联方法的字节码大小。默认值随机器变化。

-XX:LoopUnrollLimit=n

当中间表示节点数量小于这个值,展开循环体。在服务器编译之前的限制是这个值的功能,不是真实值。默认值随机器变化。

-XX:InitialTenuringThreshold=7

设置初始周期阀值,用于平行年轻收集器的自适应GC调整大小。周期阀值是对象从youngGC生还、提升到老年代的次数。

-XX:MaxTenuringThreshold=n

设置最大周期阀值,用于自适应GC调整大小。当前最大值是15。平行收集器是15CMS4

-Xloggc:<filename>

指定GC日志文件。日志由正常的日志参数控制。

-XX:-UseGCLogFileRotation

开启GC日志分割。必须设置-Xloggc

-XX:NumberOfGClogFiles=1

当分割日志时设置文件数量,必须>= 1。分割的日志使用命名规则<filename>.0, <filename>.1, ..., <filename>.n-1.

-XX:GCLogFileSize=8K

日志大小在这个大小时被分割。必须 >= 8K

 

JVM GC垃圾回收器参数设置

JVM给出了3种选择:串行收集器、并行收集器、并发收集器。串行收集器只适用于小数据量的情况,所以生产环境的选择主要是并行收集器和并发收集器。
默认情况下JDK5.0以前都是使用串行收集器,如果想使用其他收集器需要在启动时加入相应参数。JDK5.0以后,JVM会根据当前系统配置进行智能判断。
串行收集器
-XX:+UseSerialGC:设置串行收集器。
并行收集器(吞吐量优先)
-XX:+UseParallelGC:设置为并行收集器。此配置仅对年轻代有效。即年轻代使用并行收集,而年老代仍使用串行收集。
-XX:ParallelGCThreads=20:配置并行收集器的线程数,即:同时有多少个线程一起进行垃圾回收。此值建议配置与CPU数目相等。
-XX:+UseParallelOldGC:配置年老代垃圾收集方式为并行收集。JDK6.0开始支持对年老代并行收集。
-XX:MaxGCPauseMillis=100:设置每次年轻代垃圾回收的最长时间(单位毫秒)。如果无法满足此时间,JVM会自动调整年轻代大小,以满足此时间。
-XX:+UseAdaptiveSizePolicy:设置此选项后,并行收集器会自动调整年轻代Eden区大小和Survivor区大小的比例,以达成目标系统规定的最低响应时间或者收集频率等指标。此参数建议在使用并行收集器时,一直打开。
并发收集器(响应时间优先)
-XX:+UseConcMarkSweepGC:即CMS收集,设置年老代为并发收集。CMS收集是JDK1.4后期版本开始引入的新GC算法。它的主要适合场景是对响应时间的重要性需求大于对吞吐量的需求,能够承受垃圾回收线程和应用线程共享CPU资源,并且应用中存在比较多的长生命周期对象。CMS收集的目标是尽量减少应用的暂停时间,减少Full GC发生的几率,利用和应用程序线程并发的垃圾回收线程来标记清除年老代内存。
-XX:+UseParNewGC:设置年轻代为并发收集。可与CMS收集同时使用。JDK5.0以上,JVM会根据系统配置自行设置,所以无需再设置此参数。
-XX:CMSFullGCsBeforeCompaction=0:由于并发收集器不对内存空间进行压缩和整理,所以运行一段时间并行收集以后会产生内存碎片,内存使用效率降低。此参数设置运行0次Full GC后对内存空间进行压缩和整理,即每次Full GC后立刻开始压缩和整理内存。
-XX:+UseCMSCompactAtFullCollection:打开内存空间的压缩和整理,在Full GC后执行。可能会影响性能,但可以消除内存碎片。
-XX:+CMSIncrementalMode:设置为增量收集模式。一般适用于单CPU情况。
-XX:CMSInitiatingOccupancyFraction=70:表示年老代内存空间使用到70%时就开始执行CMS收集,以确保年老代有足够的空间接纳来自年轻代的对象,避免Full GC的发生。
其它垃圾回收参数
-XX:+ScavengeBeforeFullGC:年轻代GC优于Full GC执行。
-XX:-DisableExplicitGC:不响应 System.gc() 代码。
-XX:+UseThreadPriorities:启用本地线程优先级API。即使 java.lang.Thread.setPriority() 生效,不启用则无效。
-XX:SoftRefLRUPolicyMSPerMB=0:软引用对象在最后一次被访问后能存活0毫秒(JVM默认为1000毫秒)。
-XX:TargetSurvivorRatio=90:允许90%的Survivor区被占用(JVM默认为50%)。提高对于Survivor区的使用率。


JVM参数疑问解答

-Xmn,-XX:NewSize/-XX:MaxNewSize,-XX:NewRatio 3组参数都可以影响年轻代的大小,混合使用的情况下,优先级是什么?
如下:
高优先级:-XX:NewSize/-XX:MaxNewSize 
中优先级:-Xmn(默认等效 -Xmn=-XX:NewSize=-XX:MaxNewSize=?) 
低优先级:-XX:NewRatio 
推荐使用-Xmn参数,原因是这个参数简洁,相当于一次设定 NewSize/MaxNewSIze,而且两者相等,适用于生产环境。-Xmn 配合 -Xms/-Xmx,即可将堆内存布局完成。
-Xmn参数是在JDK 1.4 开始支持。

JVM参数设置优化例子

1. 承受海量访问的动态Web应用
服务器配置:8 CPU, 8G MEM, JDK 1.6.X
参数方案:
-server -Xmx3550m -Xms3550m -Xmn1256m -Xss128k -XX:SurvivorRatio=6 -XX:MaxPermSize=256m -XX:ParallelGCThreads=8 -XX:MaxTenuringThreshold=0 -XX:+UseConcMarkSweepGC
调优说明:
-Xmx 与 -Xms 相同以避免JVM反复重新申请内存。-Xmx 的大小约等于系统内存大小的一半,即充分利用系统资源,又给予系统安全运行的空间。
-Xmn1256m 设置年轻代大小为1256MB。此值对系统性能影响较大,Sun官方推荐配置年轻代大小为整个堆的3/8。
-Xss128k 设置较小的线程栈以支持创建更多的线程,支持海量访问,并提升系统性能。
-XX:SurvivorRatio=6 设置年轻代中Eden区与Survivor区的比值。系统默认是8,根据经验设置为6,则2个Survivor区与1个Eden区的比值为2:6,一个Survivor区占整个年轻代的1/8。
-XX:ParallelGCThreads=8 配置并行收集器的线程数,即同时8个线程一起进行垃圾回收。此值一般配置为与CPU数目相等。
-XX:MaxTenuringThreshold=0 设置垃圾最大年龄(在年轻代的存活次数)。如果设置为0的话,则年轻代对象不经过Survivor区直接进入年老代。对于年老代比较多的应用,可以提高效率;如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概率。根据被海量访问的动态Web应用之特点,其内存要么被缓存起来以减少直接访问DB,要么被快速回收以支持高并发海量请求,因此其内存对象在年轻代存活多次意义不大,可以直接进入年老代,根据实际应用效果,在这里设置此值为0。
-XX:+UseConcMarkSweepGC 设置年老代为并发收集。CMS(ConcMarkSweepGC)收集的目标是尽量减少应用的暂停时间,减少Full GC发生的几率,利用和应用程序线程并发的垃圾回收线程来标记清除年老代内存,适用于应用中存在比较多的长生命周期对象的情况。
2. 内部集成构建服务器案例
高性能数据处理的工具应用
服务器配置:1 CPU, 4G MEM, JDK 1.6.X
参数方案:
-server -XX:PermSize=196m -XX:MaxPermSize=196m -Xmn320m -Xms768m -Xmx1024m
调优说明:
-XX:PermSize=196m -XX:MaxPermSize=196m 根据集成构建的特点,大规模的系统编译可能需要加载大量的Java类到内存中,所以预先分配好大量的持久代内存是高效和必要的。
-Xmn320m 遵循年轻代大小为整个堆的3/8原则。
-Xms768m -Xmx1024m 根据系统大致能够承受的堆内存大小设置即可。

参考:

anzhihe安志合个人博客,版权所有丨 如未注明,均为原创 丨转载请注明转自:https://chegva.com/2905.html | ☆★★每天进步一点点,加油!★★☆

您可能还感兴趣的文章!

发表评论

电子邮件地址不会被公开。 必填项已用*标注