互动网站策划,天元建设集团有限公司 安百平 电话,h5制作软件 知乎 推荐,南昌做网站公司有哪些写作目的
最近上线了一个需求#xff0c;遇到了一个JVM报警的问题#xff0c;很荣幸能遇到#xff0c;在此分享一下整个调优的过程。
背景
我们是中台服务#xff0c;我们的甲方就是上游不同的业务。中台原则上是业务和能力分离#xff0c;但是不可避免的是分不开…写作目的
最近上线了一个需求遇到了一个JVM报警的问题很荣幸能遇到在此分享一下整个调优的过程。
背景
我们是中台服务我们的甲方就是上游不同的业务。中台原则上是业务和能力分离但是不可避免的是分不开所以我们通过SPI的机制让上游的业务实现SPI接口从而执行他们自己的逻辑。本次需求我们上线了一个大需求要同时发布很多业务方实现的SPI包。我们是灰度发布发布一台机器后发现频繁的FGC导致监控报警。
补充一下我们的机器规格是4核4G内存和80G磁盘。GC垃圾收集器是CMS和ParNew。
接下来开始进行推理和论证。
推断堆空间有问题
频繁的FGC初步想法就是OOM比如静态集合无限添加对象。但是去机器上找了一下OOM的Dump文件这个是没找到的所以说只能手动dump。
jmap -dump:formatb,file/tmp/myapp_dump.bin pid1234使用MAT去分析去找自己的类最多的发现并没有找到那种一枝独秀特别多的。下面是反例公司不方便截图。 因为是灰度所以我们有正常的机器。对比了有问题机器和没问题机器新生代和老年带的变化趋势、速成和使用大小整体是相似的这块就不符合常理了。类似下面的图。 结论新生代老年代和正常机器一样初步推断堆空间正常。
推断元空间有问题
如果不是堆空间引起的FGC那就是元空间要满了。接着通过arthas的dashboard命令对比这里发现这个值新老机器差距很大。 那就需要调大元空间
把
-XX:MetaspaceSize1500m
-XX:MaxMetaspaceSize1500mm
修改为
-XX:MetaspaceSize2048m
-XX:MaxMetaspaceSize2048m此时机器再发布后就不会出现FGC了。
结论元空间小导致频繁FGC
元空间到底为什么变大
通过JVM的命令可以看出来加载了哪些类 jcmd 28818 GC.class_histogram那我看上图有什么意义呢 对比新老机器可以获得两份加载的类 通过awk命令能洗出来有哪些类然后通过diff命令就可以看出来不同的类。
通过分析两个加载的类不同发现两个问题。
本次加载的类有本次需求新上的符合预期。里面有很多MethodAccessor看我的另一篇文章
总结
如果面试回答你可以说你引入了很多pom这种场景其实是很常见的。本文对回答的关键词都做了加深包括每一步的命令是什么且能能量化的都用数字表示比如机器大小调大元空间意味着别的会缩小所以最终方法是充钱扩大机器的配置。
课外补充
补充一下有意义的jvm启动参数
-XX:ParallelGCThreads4 并行收集几核机器设置几核
-Xms6g 调优设置新生代初始大小
-Xmx6g 调优设置新生代最大值
-Xmn2g 调优设置堆空间大小
-XX:MetaspaceSize2048m
-XX:MaxMetaspaceSize2048m
-XX:MaxDirectMemorySize1g
-XX:SurvivorRatio8 新老年代默认8:1:1
-XX:UseConcMarkSweepGC 使用CMS垃圾收集器
-XX:CMSMaxAbortablePrecleanTime5000 并发标记阶段之后、重新标记阶段之前就让你执行这么长时间
-XX:CMSClassUnloadingEnabled 允许类卸载比如线上使用内存诊断工具Arthas用完后会有残留
-XX:CMSInitiatingOccupancyFraction80 老年带到达80%触发老年代收集
-XX:UseCMSInitiatingOccupancyOnly配合上面参数使用
-XX:ExplicitGCInvokesConcurrent 针对System.gc()触发老年带的GC否则就是fullGC
-Xloggc:/home/admin/logs/gc.log GC日志目录
-XX:PrintGCDetails GC日志详细细节
-XX:PrintGCDateStamps(每个垃圾收集事件发生的确切日期和时间戳)
-XX:HeapDumpOnOutOfMemoryError OOM
-XX:HeapDumpPath/home/admin/logs/java.hprof OOM
参考
有过JVM调优经验吗【面试题】 阿里淘天Java开发工程师CSDN博客专家阿里云博客专家专注于后端技术的分享。如果你迷茫不妨来瞅瞅码农的轨迹。
一起学习共同进步