/opt/java/jdk1.8.0_102/bin/java -Dapp.home=${APP_HOME} -Dspring.profiles.active=prd -Dserver.port=${SERVER_PORT} -server -Xms4G -Xmx4G -Xmn2g -Xss256k -XX:PermSize=128m -XX:MaxPermSize=512m -Djava.awt.headless=true -Dfile.encoding=utf-8 -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:AutoBoxCacheMax=20000 -XX:-OmitStackTraceInFastThrow -XX:ErrorFile=${APP_HOME}/logs/hs_err_%p.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${APP_HOME}/logs/ -Xloggc:${APP_HOME}/logs/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -jar ${APP_HOME}/webapps/${JAR_NAME} ${SERVER_PORT}"
2)新参数(使用G1做为垃圾回收器)/opt/java/jdk1.8.0_102/bin/java -Dapp.home=${APP_HOME} -Dspring.profiles.active=prd -Dserver.port=${SERVER_PORT} -server -Xms4g -Xmx4g -Xss256k -XX:NewSize=512m -XX:MaxNewSize=512m -XX:+UseG1GC -XX:InitiatingHeapOccupancyPercent=40 -XX:G1HeapRegionSize=8m -XX:+ExplicitGCInvokesConcurrent -XX:ParallelGCThreads=4 -Dsun.rmi.dgc.server.gcInterval=36000000-Dsun.rmi.dgc.client.gcInterval=36000000-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -XX:+UseCodeCacheFlushing -XX:ReservedCodeCacheSize=256m -XX:MaxDirectMemorySize=512m -XX:GCTimeRatio=19 -XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=30 -XX:ErrorFile=${APP_HOME}/logs/hs_err_%p.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${APP_HOME}/logs/ -Xloggc:${APP_HOME}/logs/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -jar ${APP_HOME}/webapps/${JAR_NAME} ${SERVER_PORT}"
注:不同服务器环境,不同容器,脚本配置各不相同,要在对应脚本的基础上进行针对性升级生产G1回收器主要参数说明JVM相关概念说明JDK1.7内存模型#实际占用内存大小(参数):-XX:MaxPermSize(非堆) + -Xmx(堆) + -Xss(栈) + -XX:MaxDirectMemorySize(堆外)JDK1.8内存模型#实际占用内存大小(参数):-XX:MaxMateSpaceSize(堆外) + -Xmx(堆) + -Xss(栈) + -XX:MaxDirectMemorySize(堆外)GC流程图#1、什么时候触发Minor GC2、触发Minor GC 的过程3、Full GC 的过程1、新创建的对象一般会被分配在新生代中常用的新生代的垃圾回收器是 ParNew 垃圾回收器,它按照 8:1:1 将新生代分成 Eden 区,以及两个 Survivor 区创建的对象将 Eden 区全部挤满,这个对象就是「挤满新生代的最后一个对象」此时,Minor GC 就触发了2、在正式 Minor GC 前,JVM 会先检查新生代中对象,是比老年代中剩余空间大还是小Minor GC 之后 Survivor 区放不下剩余对象,这些对象就要进入到老年代,所以要提前检查老年代是不是够用3、老年代剩余空间大于新生代中的对象大小,那就直接 Minor GC,GC 完 survivor 不够放,老年代也绝对够放老年代剩余空间小于新生代中的对象大小,这时候就要进入老年代空间分配担保规则4、老年代空间分配担保规则:如果老年代中剩余空间大小,大于历次 Minor GC 之后剩余对象的大小,那就允许进行 Minor GC因为从概率上来说,以前的放的下,这次的也应该放的下那就有两种情况:老年代中剩余空间大小,大于历次 Minor GC 之后剩余对象的大小,进行 Minor GC老年代中剩余空间大小,小于历次 Minor GC 之后剩余对象的大小,进行 Full GC,把老年代空出来再检查结合第四步,开启老年代空间分配担保规则只能说是大概率上来说,Minor GC 剩余后的对象够放到老年代,如果放不下:Minor GC 后会有这样三种情况:Minor GC 之后的对象足够放到 Survivor 区,GC 结束Minor GC 之后的对象不够放到 Survivor 区,接着进入到老年代,老年代能放下,那也可以,GC 结束Minor GC 之后的对象不够放到 Survivor 区,老年代也放不下,那就只能 Full GC以上是成功 GC 的例子,以下3 中情况,会导致 GC 失败,报 OOM:紧接上一节 Full GC 之后,老年代任然放不下剩余对象,就只能 OOM未开启老年代分配担保机制,且一次 Full GC 后,老年代任然放不下剩余对象,也只能 OOM开启老年代分配担保机制,但是担保不通过,一次 Full GC 后,老年代任然放不下剩余对象,也是能 OOM注:老年代分配担保机制在JDK1.5以及之前版本中默认是关闭的,需要通过HandlePromotionFailure手动指定,JDK1.6之后就默认开启如果我们生产环境服务使用的是JDK/1.7JDK1.8,所以不用再手动去开启担保机制Full GC主要指新生代、老年代、metaspace上的全部GC感谢以下作者给与我的帮助#图解GC流程:https://www.cnblogs.com/shuiyj/p/12640692.htmlCMS垃圾回收升级G1回收器实践:http://arick.net/content/44JAVA常见问题分析:https://blog.51cto.com/hmtk520/2067043作者: zhfeat出处:https://www.cnblogs.com/zhfeat/p/13261543.html(图片来源网络,侵删)
0 评论