# JVM基本参数设置
1.通用配置
-XX:PretenureSizeThreshold=1m
:大对象直接分配在老年代,这个参数只对 Serial 和ParNew两个收集器有效-XX:MaxTenuringThreshold=15
:动态年龄超过15次,进入老年代。等于 0 的话,就直接入老年代-Xms20m
:设置堆内存的初始大小,堆大小的最小值-Xmx20m
:设置堆内存的最大大小-Xmn10m
:设置新生代内存大小-XX:G1HeapRegionSize
:G1收集器每个Region的大小-XX:SurvivorRatio=8
:设置一个eden和一个suvivor的比值-XX:+HeapDumpOnOutOfMemoryError
:打印 OOM 日志-XX:HeapDumpPath=路径
:OOM 日志输出位置(可通过JVisualVM 工具进行分析)-XX:+HeapDumpBeforeFullGC
:Full GC 之前打印 dump 文件-XX:+HeapDumpAfterFullGC
:Full GC 之后打印 dump 文件
2.G1配置
- -XX:+UseG1GC:使用G1垃圾回收器
- -XX:MaxGCPauseMillis=N:设置最大停顿时间
- -XX:G1HeapRegionSize=N:设置每个region的大小,范围在1-32m,是2的幂次方
- -XX:ParallelGCThreads=8:设置G1 GC回收线程数
- -XX:ConcGCThreads:并发标记阶段,设置gc 工作线程数量
- -XX:InitiatingHeapOccupancyPercent:默认是45%,这个占比跟并发周期的启动相关,当空间占比达到这个值时,会启动并发周期。如果经常出现FullGC,可以调低该值,尽早的回收可以减少FullGC的触发,但如果过低,则并发阶段会更加频繁,降低应用的吞吐。
- .-XX:G1MixedGCLiveThresholdPercent:在混合垃圾收集周期中的old region的占用阈值,默认值为85,意思是如果一个Old Region中的存活对象大于Region大小的85%的话,就不去回收这个Region,不加入Cset。否则回收时将85%的存活对象放入另一个Region中,得不偿失。
- -XX:G1MixedGCCountTarget = 8:设置在标记周期完成之后混合收集的次数,默认是8次。如果单次回收CSet + 年轻代时间远远超过最大停顿时间,则会触发多次mixed GC每次回收部分CSet,以达到最大停顿时间目的
- -XX:G1HeapWastePercent=5:设置浪费的堆内存百分比,当可回收百分比小于浪费百分比时,JVM就不会启动混合垃圾收。也就是并发标记后,并不一定会触发mixed GC。
3.CMS配置
-XX:+UseConcMarkSweepGC
:使用 cms 垃圾回收器-XX:CMSInitiatingOccupancyFraction=68
:cms 收集器触发的阈值,当老年代占比达到 68% 时,触发 CMS 垃圾回收-XX:-CMSPrecleaningEnabled
:关闭并发预清理阶段,默认启用;关闭之后将直接进入 remark 阶段-XX:CMSMaxAbortablePrecleanLoops=20
:可中断预清理循环次数,达到这个次数就会退出循环-XX:CMSMaxAbortablePrecleanTime=5
:可中断预清理循环时间,超过这个时间就会退出循环-XX:CMSScheduleRemarkEdenPenetration=50
:可中断预清理循环阈值,当 Eden 区内存使用率达到了这个阈值,会退出循环,默认是 50%-XX:CMSFullGCsBeforeCompaction=0
在上一次 CMS 并发GC执行过后,到底还要再执行多少次full GC才会做整理。默认是0,也就是在默认配置下每次CMS GC顶不住了而要转入full GC的时候都会做整理
4.Paraller配置
- -XX:+UseAdaptiveSizePolicy:自适应
- -XX:MaxGCPauseMillis=100 :控制最大垃圾收集停顿时间的参数。
- -XX:GCTimeRatio=19 :直接设置吞吐量大小的参数。
- -XX:+UseParallelOldGC:使用parallel scavenge + parallel old
5.GC 日志
-Xloggc:../log/gc.log
:gc日志输出位置-XX:NumberOfGCLogFiles=10
:生成gc文件的数量,循环重复使用,gc.log.5.current 代表当前正在写入的日志文件-XX:+PrintGCDetails
:打印GC日志详细信息-XX:+PrintGCDateStamps
:输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)-XX:+PrintGCApplicationStoppedTime
:gc之前,打印应用程序线程 STW 花费的时间-XX:+SafepointTimeout
:开启安全点停顿超时时间设置-XX:SafepointTimeoutDelay=2000
:设置安全点停顿超时时间阈值-XX:+PrintSafepointStatistics
:打印在安全点停顿超时的线程信息-XX:+PrintTenuringDistribution
:JVM 在每次新生代GC时,打印出幸存区中对象的年龄分布(对 -XX:+UseParallelGC无效)