如何合理估算主机配置需求( 四 )


step6:多大的对象,可以直接到老年代比较合适?
对于多大的对象直接进入老年代(参数-XX:ld),一般可以结合自己系统看下有没有什么大对象 生成,预估下大对象的大小,一般来说设置为1M就差不多了,很少有超过1M的大对象,
所以:可以适当调整JVM参数如下:
‐Xms3072M ‐Xmx3072M ‐Xmn2048M ‐Xss1M ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M ‐XX:SurvivorRatio=8 ‐XX:MaxTenuringThreshold=5 ‐XX:PretenureSizeThreshold=1M
step7:垃圾回收器CMS老年代的参数优化
JDK8默认的垃圾回收器是-XX:+(年轻代)和-XX:+(老年代),
如果内存较大(超过4个G,只是经验 值),还是建议使用G1.
这里是4G以内,又是主打“低延时” 的业务系统,可以使用下面的组合:
ParNew+CMS(-XX:+UseParNewGC -XX:+UseConcMarkSweepGC)
新生代的采用回收器,工作流程就是经典复制算法,在三块区中进行流转回收,只不过采用多线程并行的方式加快了速度 。
老生代的采用CMS 。再去优化老年代参数:比如老年代默认在标记清除以后会做整理,还可以在CMS的增加GC频次还是增加GC时长上做些取舍,
如下是响应优先的参数调优:
XX:CMSInitiatingOccupancyFraction=70
设定CMS在对内存占用率达到70%的时候开始GC(因为CMS会有浮动垃圾,所以一般都较早启动GC)
XX:+UseCMSInitiatinpOccupancyOnly
和上面搭配使用,否则只生效一次
-XX:+AlwaysPreTouch
强制操作系统把内存真正分配给IVM,而不是用时才分配 。
综上,只要年轻代参数设置合理,老年代CMS的参数设置基本都可以用默认值,如下所示:
‐Xms3072M ‐Xmx3072M ‐Xmn2048M ‐Xss1M ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M ‐XX:SurvivorRatio=8‐XX:MaxTenuringThreshold=5 ‐XX:PretenureSizeThreshold=1M ‐XX:+UseParNewGC ‐XX:+UseConcMarkSweepGC ‐XX:CMSInitiatingOccupancyFraction=70 ‐XX:+UseCMSInitiatingOccupancyOnly ‐XX:+AlwaysPreTouch
参数解释
1.‐ ‐ 最小最大堆设置为3g,最大最小设置为一致防止内存抖动
2.‐Xss1M 线程栈1m
3.‐ ‐XX:=8 年轻代大小2g,eden与的比例为8:1:1,也就是1.6g:0.2g:0.2g
4.-XX:=5 年龄为5进入老年代 5.‐XX:ld=1M 大于1m的大对象直接在老年代生成
6.‐XX:+ ‐XX:+ 使用+cms垃圾回收器组合
7.‐XX:=70 老年代中对象达到这个比例后触发
8.‐XX:+ 老年代中对象达到这个比例后触发,每次
9.‐XX:+ 强制操作系统把内存真正分配给IVM,而不是用时才分配 。
step8:配置OOM时候的内存dump文件和GC日志
额外增加了GC日志打印、OOM自动dump等配置内容,帮助进行问题排查
-XX:+HeapDumpOnOutOfMemoryError
在Out Of,JVM快死掉的时候,输出Heap Dump到指定文件 。
不然开发很多时候还真不知道怎么重现错误 。
路径只指向目录,JVM会保持文件名的唯一性,叫${pid}.hprof 。
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${LOGDIR}/
因为如果指向特定的文件,而文件已存在,反而不能写入 。
输出4G的,会导致IO性能问题,在普通硬盘上,会造成20秒以上的硬盘IO跑满,
需要注意一下,但在容器环境下,这个也会影响同一宿主机上的其他容器 。