JVM配置参数说明,参考N多文章和一些书籍总结如下:
参数 | 说明 | 默认值 | 生产环境约定 |
内存管理策略 | |||
-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:+UseConcMarkSweepGC | 指定在Old Generation使用Concurrent Low Pause Collector,设置并发收集器 | 可与如下配合使用:-XX:ParallelGCThreads -XX:+UseParNewGC | 适用于多CPU,并要求缩短因GC造成程序停滞的时间。这种GC可以在Old区的回收同时,运行应用程序。-XX:+UseConcMarkSweepGC参数启动该GC。 |
-XX:ParallelCMSThreads | 指定启用并发回收的线程数目 | CMS默认启动的回收线程数目是 (ParallelGCThreads + 3)/4),其中ParallelGCThreads是年轻代的并行收集线程数 | |
-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)*(100-CMSInitiatingOccupancyFraction)/100>=Xmn就不会出现promotion failed |
统计垃圾回收信息 | |||
-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:+DisableExplicitGC | 禁止 java 程序中的 full gc, 如System.gc() 的调用. 最好加上么, 防止程序在代码里误用了。对性能造成冲击。 |