java-1.7 jvm-config

322 阅读5分钟

1.堆设置

-Xms:初始堆大小
-Xmx:最大堆大小
-XX:NewSize=n:设置年轻代大小
-XX:NewRatio=n:设置年轻代和年老代的比值。默认为3,表示年轻代与年老代比值为12,年轻代占整个年轻代年老代和的1/3
-XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示EdenSurvivor=32,一个Survivor区占整个年轻代的1/5(默认使用UseAdaptiveSizePolicy参数,此参数失效,需要手工指定)
-XX:MaxPermSize=n:设置持久代大小(JAVA8中使用-XX:MetaSpaceSize和-XX:MaxMetaspaceSize代替原来的-XX:PermSize和-XX:MaxPermSize。)
-XX:MaxTenuringThreshold:垃圾最大年龄(晋升到年老代)
-Xss设置每个线程的堆栈大小

2.收集器设置

-XX:+UseSerialGC:设置串行收集器
-XX:+UseParallelGC:设置并行收集器
-XX:+UseParalledlOldGC:设置并行年老代收集器
-XX:+UseConcMarkSweepGC:设置并发收集器

3.Gc日志设置

-XX:+PrintGCDetails:打印Gc详细日志 -
XX:+PrintGCTimeStamps:打印GC的时间
-XX:+PrintGCApplicationStoppedTime:打印应用暂停时间
-XX:+PrintHeapAtGC: 在GC发生的前后打印堆信息
-XX:+PrintTenuringDistribution: 打印对象的年龄信息
-Xloggc:filename: 指定GC日志文件所存放的路径

4.其他设置:

-XX:+PrintFlagsFinal: 输出所有jvm参数和值
-XX:+PrintFlagsInitial: 所有jvm参数的默认值
-XX:+PrintCommandLineFlags: 已经被用户或者 JVM 设置过的详细的 XX 参数的名称和值
-XX:-DisableExplicitGC: 不响应 System.gc() 代码。

并行收集器(吞吐量优先)

-XX:+UseParallelGC:设置为并行收集器。此配置仅对年轻代有效。
-XX:ParallelGCThreads=20:配置并行收集器的线程数,此值建议配置与CPU数目相等。
-XX:+UseParallelOldGC:配置年老代垃圾收集方式为并行收集。JDK6.0开始支持对年老代并行收集。
-XX:GCTimeRatio:设置垃圾回收时间占程序运行时间的百分比,默认99,即最大允许1%时间做GC.-XX:MaxGCPauseMillis=100(谨慎使用):设置每次年轻代垃圾回收的最长时间(单位毫秒)
-XX:MaxGCPauseMillis=100(谨慎使用):设置每次年轻代垃圾回收的最长时间(单位毫秒)
-XX:+UseAdaptiveSizePolicy(默认开启,surviveRatio参数实效):自适应策略

并发收集器(响应时间优先)

-XX:+UseConcMarkSweepGC:即CMS收集,设置年老代为并发收集。
-XX:+UseParNewGC:设置年轻代为并发收集。
-XX:ParallelCMSThreads: CMS默认启动的回收线程数目是 (ParallelGCThreads + 3)/4)
-XX:CMSFullGCsBeforeCompaction=0:此参数设置运行0Full GC后对内存空间进行压缩和整理
-XX:+UseCMSCompactAtFullCollection:设置CMS收集器在完成垃圾回收了之后是否进行一次内存碎片整理(整理过程是独占的,会引起停顿时间变长)
-XX:+UseCMSInitiatingOccupancyOnly:使用手动定义初始化定义开始CMS收集
-XX:CMSInitiatingOccupancyFraction=70:表示年老代内存空间使用到70%时就开始执行CMS收集(注:UseCMSInitiatingOccupancyOnlyCMSInitiatingOccupancyFraction一定要一起使用,不然不生效)
-XX:+CMSParallelRemarkEnabled:开启并行remark,降低标记停顿
-XX:+CMSScavengeBeforeRemark:强制remark之前开始一次minor gc,减少remark的暂停时间
-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled:清理永久代

生产建议GC配置:

OPTS_MEMORY="-Xms5120M -Xmx5120m -Xmn3072M -XX:PermSize=256M -XX:MaxPermSize=256m -XX:MaxTenuringThreshold=2 -XX:ParallelGCThreads=4
-XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=20
-XX:+CMSParallelRemarkEnabled -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection -XX:+CMSClassUnloadingEnabled
-verbose:gc -Xloggc:../gc.log -XX:+PrintGCDetails -XX:+PrintHeapAtGC -XX:+PrintGCDateStamps
-XX:+PrintAdaptiveSizePolicy -XX:+PrintTenuringDistribution -XX:+PrintReferenceGC"

GC类型可选参数

Serial GC
-XX:+UseSerialGC

Parallel GC
-XX:+UseParallelGC
-XX:ParallelGCThreads=value
开启此参数使用parallel scavenge & parallel old搜集器(server模式默认值)。
Parallel Compacting GC
-XX:+UseParallelOldGC

CMS GC
-XX:+UseConcMarkSweepGC
-XX:+UseParNewGC
-XX:+CMSParallelRemarkEnabled
-XX:CMSInitiatingOccupancyFraction=value
-XX:+UseCMSInitiatingOccupancyOnly

G1
-XX:+UnlockExperimentalVMOptions
-XX:+UseG1GCJDK 6中这两个参数必须配合使用

G1相关的参数

-XX:MaxGCPauseMillis=200 - 设置最大GC停顿时间指标,JVM会尽力实现,但不保证. 默认值为200毫秒.
-XX:InitiatingHeapOccupancyPercent=45 - 如果老年代占据了堆内存的45%的时候,此时会触发一次mixGc。值为0则表示“一直执行GC循环)'. 默认值为45。
-XX:G1MixedGCLiveThresholdPercent:默认值是85%,确定要回收的Region的时候,必须是存活对象低于85%的Region才可以回收。
-XX:G1ReservePercent=n 设置堆内存保留为假天花板的总量,以降低提升失败的可能性. 默认值是 10.
-XX:ConcGCThreads=n 并发垃圾收集器使用的线程数量. 默认值随JVM运行的平台不同而不同.
-XX:+UseG1GC - 让 JVM使用G1垃圾收集器, jdk9被设为默认垃圾收集器;所以如果你的版本比较新则不再需要使用该参数


下面参数不建议修改
-XX:G1NewSizePercent=5    设置年轻代占整个堆的最小百分比,默认值是堆的5%。需要开启-XX:UnlockExperimentalVMOptions
-XX:G1MaxNewSizePercent=60    设置年轻代占整个堆的最大百分比,默认值是堆的60%。
-XX:G1HeapRegionSize=n region大小  默认值将根据 heap size 算出最优解;1M-32M
-XX:G1MixedGCCountTarget mixed回收执行次数,默认回收次数8。
-XX:G1HeapWastePercent,默认值是5%,就是说空出来的区域大于整个堆的5%,即使未达到回收次数,也会立即停止混合回收了。
如:默认回收次数是8次,但是可能到了4次,发现空闲Region大于整个堆的5%,就不会再进行后续回收了。