JVM配置参数大全(备忘录)

参数

说明

默认值

生产环境约定

内存管理策略

-Xms/-Xmx

定义YOUNG+OLD段的总尺寸,ms为JVM启动时YOUNG+OLD的内存大小;mx为最大可占用的YOUNG+OLD内存大小。

默认是物理内存的1/64但小于1G。

在用户生产环境上一般将这两个值设为相同,以减少运行期间系统在内存申请上所花的开销。

-Xmn

设置young generation的内存大小。

整个堆大小=年轻代大小 + 年老代大小。所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。

 

-XX:PermSize/-XX:MaxPermSize

定义Perm区的尺寸,PermSize为JVM启动时Perm的内存大小;MaxPermSize为最大可占用的Perm内存大小。

这个参数需要看实际情况。 可以通过jmap 命令看看到底需要多少。

在用户生产环境上一般将这两个值设为相同,以减少运行期间系统在内存申请上所花的开销。

-XX:SurvivorRaito

设置YOUNG段中Eden区与Survivor区的比值,如此值为4,则Eden为4/6,两个Survivor分别为1/6。

-XX:SurvivorRatio=65536,-XX:MaxTenuringThreshold=0就是去掉了救助空间;可以减少FullGC造成系统停顿,提高一定系统性能,新生代未对垃圾进行多次回收

 

-Xss

设置栈的大小。

JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。一般来说,web框架下的应用需要256K即可。 如果你的程序有大规模的递归行为,请考虑设置到512K/1M。 这个需要全面的测试才能知道。 不过,256K已经很大了。 这个参数对性能的影响比较大的。

在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。

-XX:GCTimeRatio=<n>

系统吞吐量,衡量GC所占比重

系统默认是99

如n=19则表示系统吞吐量为95%  19/(19+1)

-XX:+UseAdaptiveSizePolicy

设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低响应时间或者收集频率等。

 

 

 

-XX:+UseAdaptiveSizePolicy

-XX:NewRaito

设置YOUNG与OLD段的比值。

在使用 CMS GC 的情况下此参数失效 ,如 :-XX:NewRatio=2

 

-XX:NewSize/-XX:MaxNewSize

定义YOUNG段的尺寸,NewSize为JVM启动时YOUNG的内存大小;MaxNewSize为最大可占用的YOUNG内存大小。

默认是物理内存的1/4但小于1G。

在用户生产环境上一般将这两个值设为相同,以减少运行期间系统在内存申请上所花的开销。

-XX:MaxGCPauseMillis

设置每次年轻代垃圾回收的最长时间,如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值。

 

-XX:MaxGCPauseMillis

-XX:MinHeapFreeRatio=<n>

指定 jvm heap 在使用率小于 n 的情况下 ,heap 进行收缩 ,Xmx==Xms 的情况下无效 , 如 :-XX:MinHeapFreeRatio=30

 

 

-XX:MaxHeapFreeRatio=<n>

指定 jvm heap 在使用率大于 n 的情况下 ,heap 进行扩张 ,Xmx==Xms 的情况下无效 , 如 :-XX:MaxHeapFreeRatio=70

 

 

-XX:LargePageSizeInBytes=<n>

指定 Java heap 的分页页面大小 , 如 :-XX:LargePageSizeInBytes=128m

 

 

串行垃圾回收策略

-XX:+UseSerialGC

设置串行收集器,较老版本JVM默认使用的GC方式,性能比较低

为单线程GC,也是默认的GC。,该GC适用于单CPU机器

 

-XX:MaxTenuringThreshold =<n>

设置垃圾最大年龄。

指定一个 object 在经历了 n 次 young gc 后转移到 old generation 区 , 在 linux64 的 java6 下默认值是 15, 此参数对于 并行GC 无效 , 如 :-XX:MaxTenuringThreshold=31

如果设置为0的话,则新生对象不经过Survivor区,直接进入OLD段。对于OLD对象比较多的应用,可以提高效率。如果将此值设置为一个较大值,则新生对象会在Survivor区进行多次复制,这样可以增加对象的存活时间,增加在minor collection及时回收的概率。

并行垃圾回收策略

-XX:+UseParNewGC

指定在 young Generation 使用 parallel collector, 是 UseParallelGC 的 gc 的升级版本 , 有更好的性能和优点 , 可以和 CMS gc 一起使用

 

 

-XX:+UseParallelOldGC

配置年老代垃圾收集方式为并行收集。JDK6.0支持对年老代并行收集。

 

 

-XX:ParallelGCThreads

配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。

默认是物理 processor 的个数

此值最好配置与处理器数目相等。

-XX:+UseParallelGC

选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集,其升级版本为UseParNewGC性能会更好一些。

指定在 young区 使用 parallel collector, 并行收集 , 暂停 app threads, 同时启动多个垃圾回收 thread, 不能和 CMS gc 一起使用 . 系统吨吐量优先 , 但是会有较长长时间的 app pause, 后台系统任务可以使用此 gc

 

-XX:+CMSIncrementalMode

设置为增量模式

适用于单CPU情况

并发垃圾回收策略

XX:+UseConcMarkSweepGC

指定在Old Generation使用Concurrent Low Pause Collector,设置并发收集器

可与如下配合使用:-XX:ParallelGCThreads

-XX:+UseParNewGC

适用于多CPU,并要求缩短因GC造成程序停滞的时间。这种GC可以在Old区的回收同时,运行应用程序。

并发GC 当出现concurrent Mode failure时采用串行GC

-XX:ParallelCMSThreads

指定启用并发回收的线程数目

CMS默认启动的回收线程数目是  (ParallelGCThreads + 3)/4),其中ParallelGCThreads是年轻代的并行收集线程数

 Java5配置不成功

-XX:+CMSPermGenSweepingEnabled

指定perm区启用CMS收集器

 

 

-XX:+CMSClassUnloadingEnabled

通常配合上一项使用

 

 

-XX:+CMSParallelRemarkEnabled

在使用 UseParNewGC 的情况下 , 尽量减少 mark 的时间

 

 

XX:+CMSScavengeBeforeRemark

如何mark时间还是过长,可以通过此选项进一步加强,在mark之前进行一次minorGC

 

 

-XX:+UseCMSCompactAtFullCollection

在FULL GC的时候, 压缩内存, CMS是不会移动内存的, 因此, 这个非常容易产生碎片, 导致内存不够用, 因此, 内存的压缩这个时候就会被启用。 增加这个参数是个好习惯。

如果启用本项,系统默认每次FullGC,都会进行内存压缩

这个配置是把双刃剑,在一定程度上能减少FullGC,但是也会影响一点性能,本操作执行时应用会暂停

-XX:CMSFullGCsBeforeCompaction=<n>

用来指定多少次FullGC才压缩内存,通常配合-XX:+UseCMSCompactAtFullCollection使用

如:-XX:CMSFullGCsBeforeCompaction=5

 

-XX:CMSInitiatingOccupancyFraction=<n>

指示在 old generation 在使用了 n% 的比例后 , 启动 cmsGC,较低版本JVM默认值是 68, jdk6默认是92如 :-XX:CMSInitiatingOccupancyFraction=70

68/92

基本上满足(Xmx-Xmn-PermSize)*(100-CMSInitiatingOccupancyFraction)/100>=Xmn就不会出现promotion failed

-XX:+UseCMSInitiatingOccupancyOnly

来使vm只使用old内存占用比来触发CMS GC。

禁止hostspot自行触发CMS GC

-XX:CMSInitiatingPermOccupancyFraction

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

92

统计垃圾回收信息

-XX:+PrintGC

-Xloggc:filename

 

垃圾回收统计信息


如在环境加上如下参数用于分析JVM表现
-verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:/home/test/logs/gc.log

 

-XX:+PrintGCDetails

打应垃圾收集的情况

如 :
[GC 15610.466: [ParNew: 229689K->20221K(235968K), 0.0194460 secs] 1159829K->953935K(2070976K), 0.0196420 secs]

 

-XX:+PrintGCTimeStamps

打应垃圾收集的时间情况

如 :
[Times: user=0.09 sys=0.00, real=0.02 secs]

 

-XX:+PrintGCApplicationStoppedTime

打应垃圾收集时 , 系统的停顿时间

如 :
Total time for which application threads were stopped: 0.0225920 seconds

 

-XX:+PrintGCApplicationStoppedTime

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

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

-XX:+PrintGCApplicationConcurrentTime

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

输出形式:Application time: 0.5291524 seconds

-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:+DisableExplicitGC

禁止 java 程序中的 full gc, 如 System.gc() 的调用. 最好加上么, 防止程序在代码里误用了。对性能造成冲击。

 

-XX:+HeapDumpOnOutOfMemoryError

当出现OutOfMemory错误时候,系统产生heapdump信息

-XX:+HeapDumpOnCtrlBreak

当使用kill -3时候,会产生heapdump信息

-XX:+UseBiasedLocking

锁机制的性能改善

-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:+ScavengeBeforeFullGC

Full GC前调用YGC

true

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

-XX:+AggressiveHeap

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

 

GC类型

触发条件

触发时发生了什么

YGC

eden空间不足

清空Eden+from survivor中所有no ref的对象占用的内存
将eden+from sur中所有存活的对象copy到to sur中
一些对象将晋升到old中:  to sur放不下的存活次数超过turning threshold中的

重新计算tenuring threshold(serial parallel GC会触发此项)

重新调整Eden 和from的大小(parallel GC会触发此项)

FGC

old空间不足
perm空间不足
显示调用System.GC, RMI等的定时触发
YGC时的悲观策略
dump live的内存信息时(jmap –dump:live)

清空heap中no ref的对象
permgen中已经被卸载的classloader中加载的class信息

如配置了CollectGenOFirst,则先触发YGC(针对serial GC)
如配置了ScavengeBeforeFullGC,则先触发YGC(针对serial GC)

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值