经验
系统真正最大的问题,就是因为内存分配、参数设置不合理,导致你的对象 频繁的进入老年代,然后频繁触发老年代gc,导致系统频繁的每隔几分钟就要卡死几秒钟。
针对大内存机器通常建议采用G1垃圾回收器。
尽量让每次Young GC后的存活对象小于Survivor区域的50%,都留存在年轻代里。尽量别让对象 进入老年代。尽量减少Full GC的频率,避免频繁Full GC对JVM性能的影响。
通用
-Xms:Java堆内存的大小
-Xmx:Java堆内存的最大大小
-Xmn:Java堆内存中的新生代大小,扣除新生代剩下的就是老年代的内存大小了
-XX:PermSize:永久代大小
-XX:MaxPermSize:永久代最大大小
-Xss:每个线程的栈内存大小
-XX:MetaspaceSize:元空间初始大小
-XX:MaxMetaspaceSize:元空间最大值 推荐512MB就够了
-XX:MaxTenuringThreshold 默认15岁,当回收15次也回收不了,就进入老年代。
-XX:PretenureSizeThreshold 对象大小超过这个值,直接进入老年代。
-XX:HandlePromotionFailure 老年代可用空间是否大于历次Minor GC过后进入老年代的对象的平均大小
-XX:SurvivorRatio=8 调整新生代eden区占新生代比例8/10.
-XX:MaxDirectMemorySize=2G 堆外内存最大值
-XX:TargetSurvivorRatio 默认50%,动态年龄,1+。。+n的Survivor中对象超过这个比例,就去老年代。
-XX:+DisableExplicitGC 禁止显式执行GC,不允许你来通过代码触发GC
-XX:+HeapDumpOnOutOfMemoryError OOM的时候自动dump内存快照出来
-XX:HeapDumpPath=/usr/local/app/oom 把内存快照放到哪儿去
Xms与Xmx设置一样。
XX:PermSize与XX:MaxPermSize设置一样,一般设置几百MB。(低版本)
XX:MetaspaceSize与MaxMetaspaceSize设置一样,一般几百MB。(1.8及以上)
Xss一般默认即可,512KB到1MB。
示例:
java -Xms512M -Xmx512M -Xmn256M -Xss1M -XX:PermSize=128M -XX:MaxPermSize=128M -jar App.jar
使用哪种GC算法
-XX:+UseParNewGC 新生代使用ParNew回收算法
-XX:+UseSerialGC 新生代设置串行收集器
-XX:+UseParallelGC 新生代设置并行收集器
-XX:+UseParalledlOldGC 设置并行年老代收集器
-XX:+UseConcMarkSweepGC 老年代设置CMS
-XX:+UseG1GC 用G1,全堆
ParNew
-XX:ParallelGCThreads 新生代回收并行线程数,默认cpu核数,可通过此参数进行设置。
-XX:+UseParNewGC 新生代使用ParNew回收算法
Parallel Scavenge
-XX:MaxGCPauseMillis Parallel Scavenge 垃圾回收算法控制最大的垃圾收集停顿时间(尽力)
-XX:GCTimeRatioi Parallel Scavenge设置吞吐量的大小,取值0-100,系统花费不超过1/(1 +n)的时间用于垃圾收集
-XX:+UseAdptiveSizePolicy Parallel Scavenge回收器打开自适应策略后,无需手动设置新生代的大小( -Xmn )、Eden与Survivor区的比例( -XX:SurvivorRatio )等参数虚拟机会自动根据系统的运行状况收集性能监控信息,动态地调整这些参数,从而达到最优的停顿时间以及最高的吞吐量
-XX:ParallelGCThreads 新生代回收并行线程数,默认cpu核数,可通过此参数进行设置。
-XX:+UseParallelGC 新生代设置并行收集器
cms
-XX:CMSInitiatingOccupancyFraction 参数可以用来设置老年代占用多少比例的时候触发CMS垃圾回收
-XX:+UseCMSCompactAtFullCollection 默认是打开的,在Full GC之后要再次进行“Stop the World”,停止工作线程,然后进行碎片整理,就是把存活对象挪到一起,空出来大片连续内存空间,避免内存碎片。
-XX:CMSFullGCsBeforeCompaction 执行多少次Full GC之后再执行一次内存碎片整理的工作,默认是0,意思就是每次Full GC之后都会进行一次内存整理。
-XX:+UseConcMarkSweepGC 老年代设置CMS
-XX:+UseCMSInitiatingOccupancyOnly 只是用设定的回收阈值,如果不指定,JVM仅在第一次使用设定值,后续则自动调整.
-XX:+CMSIncrementalMode 该标志将开启CMS收集器的增量模式。增量模式经常暂停CMS过程,以便对应用程序线程作出完全的让步。因此,收集器将花更长的时间完成整个收集周期。
-XX:+CMSScavengeBeforeRemark 在CMS GC前启动一次ygc,目的在于减少old gen对ygc gen的引用,降低remark时的开销
-XX:ParallelCMSThreads=6 定义并发CMS过程运行时的线程数
-XX:+CMSParallelInitialMarkEnabled 开启该阶段的并行标记,使用多个线程进行标记,减少暂停时间。
-XX:+CMSParallelRemarkEnabled 开启并行的Remark,加快remark的速度。
g1
-XX:+UseG1GC 用G1,全堆,会自动用堆大小除以2048,因为JVM最多可以有2048个Region,然后Region的大小必须是2的倍数
-XX:G1HeapRegionSize 手动指定每个region的大小
-XX:G1NewSizePercent 新生代初始region比例,默认5%
-XX:G1MaxNewSizePercent 新生代最大百分比,默认60%
-XX:MaxGCPauseMills 最大停顿时间,默认200ms
-XX:InitiatingHeapOccupancyPercent 默认45%,达到这个值就会混合GC。
-XX:G1MixedGCCountTarget 一次混合回收,最后一个阶段执行几次回收,默认8次。
-XX:G1HeapWastePercent 默认5%,混合回收时,如果空闲区域比例超过这个值就停止混合回收。
-XX:G1MixedGCLiveThresholdPercent 默认85%,意思是region里面存活的对象比例低于这个值,才会混合回收
模版
-Xms4096M -Xmx4096M -Xmn3072M -Xss1M
-XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M
-XX:+UseParNewGC -XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFaction=92
-XX:+UseCMSCompactAtFullCollection
-XX:CMSFullGCsBeforeCompaction=0
-XX:+CMSParallelInitialMarkEnabled
-XX:+CMSScavengeBeforeRemark
-XX:+PrintGCDetails
-Xloggc:gc.log
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/usr/local/app/oom
评论区