参数 | 说明 | 默认值 | 生产环境约定 | |
内存管理策略 | ||||
-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
| 垃圾回收统计信息 |
|
| |
-XX:+PrintGCDetails | 打应垃圾收集的情况 | 如 : |
| |
-XX:+PrintGCTimeStamps | 打应垃圾收集的时间情况 | 如 : |
| |
-XX:+PrintGCApplicationStoppedTime | 打应垃圾收集时 , 系统的停顿时间 | 如 : |
| |
-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) | ||
其他 | ||||
-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 | 试图是使用大量的物理内存 |
GC类型 | 触发条件 | 触发时发生了什么 |
YGC | eden空间不足 | 清空Eden+from survivor中所有no ref的对象占用的内存 重新计算tenuring threshold(serial parallel GC会触发此项) 重新调整Eden 和from的大小(parallel GC会触发此项) |
FGC | old空间不足 | 清空heap中no ref的对象 |