JVM<一> 初识JVM CLASS文件结构_丛林雪狼code的博客-优快云博客
JVM<二> 运行时区域 Run-Time Data Areas_丛林雪狼code的博客-优快云博客
JVM<三> Gc Garbage Collection垃圾处理器_丛林雪狼code的博客-优快云博客
JVM 调优,调的是什么?---> 减少 Full Gc 的次数;
什么时候触发 Full Gc ? ---> 老年代区存储满达到极值或metaSpace 区满载 拓展时;
Full Gc 进行时会产生什么?---> Stop world ; 暂停服务、服务卡顿;
Jvm 调优战略思想:
服务启动时,开启监控 Jvm 运行情况;当发生 Full Gc 后,记录内存使用的详细情况,排查业务逻辑代码;进行调优;
场景:浅学JVM后,想对开发环境中的项目进行一次初步调优;
因此,开始查看如何能看到 Full Gc 的方法;.......<中间去找度娘啦.......> 那么,JVM中自带参数可以查看,初识参数:
-Xss256k (棧最大深度大小)
初使命令:输出gc日志 gc.log (默认存储于项目更路径下,每次重启项目都会被格式化)
gc.log 部分内容展示:项目启动即4次 Full Gc
Full Gc 日志摘录解析:
2021-12-30T14:06:57.979+0800: 11.205: [Full GC (Metadata GC Threshold) [PSYoungGen: 10834K->0K(49664K)] [ParOldGen: 33332K->38943K(136704K)] 44166K->38943K(186368K), [Metaspace: 56532K->56532K(1101824K)], 0.2769795 secs] [Times: user=0.87 sys=0.01, real=0.28 secs] Full GC (Metadata GC Threshold):说明了本次垃圾收集的停顿类型,不是用来区分新生代GC还是老年代GC,如果有Full,说明本次GC发生了Stop-The-World。
[PSYoungGen: 10834K->0K(49664K)]:GC发生的区域-> PS ->Paraller Scavenge 也就是堆内存的年轻代;10834K->0K(49664K) 指的是 GC 之前使用内存 10834k(10M)->GC 后占用内存0k(0M),总内存 49664K(50M)
[ParOldGen: 33332K->38943K(136704K)] :GC发生的区域-> ParOldGen->Paraller Old 也就是堆内存的老年代区域;33332K->38943K(136704K) 指的是 GC 之前使用内存 33332K(34M)->GC 后占用内存38943K(39M),总内存 136704K(150M)
44166K->38943K(186368K) : GC之前堆内存占用45M,GC之后堆内存占39M,堆内存总占186M
[Metaspace: 56532K->56532K(1101824K)]:GC发生的区域-> Metaspace->元数据空间;56532K->56532K(1101824K) 指的是 GC 之前使用内存 56532k(57M)->GC 后占用内存56532K(57M),总内存 1101824K(150M)
经GC日志分析,找出Full GC的原因为 metaSpace 扩容导致Full Gc;JDK1.8默认metaSpace的大小为 21M,而实际中大约为 57M -> 60M;故此时JVM 调优措施是将 metaSpace空间的大小设置大一点:-XX:MetaspaceSize=100m
经过调优后 重启项目 再次查看gc日志 ,便没了 Full Gc ;
尝到了一丁点的小甜头;
加油 !继续努力.......