首页 > 其他分享 >JVM频繁GC分析

JVM频繁GC分析

时间:2024-09-15 21:52:31浏览次数:3  
标签:8192K 2048.0 0.00 频繁 secs PSYoungGen GC JVM

本文记录一次频繁GC的分析

问题

查看项目日志发现GC频繁,几乎几秒钟一次

查看GC日志

[GC (Allocation Failure) [PSYoungGen: 6816K->320K(8192K)] 82693K->76229K(187904K), 0.0032930 secs] [Times: user=0.01 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [PSYoungGen: 6464K->224K(8192K)] 82373K->76165K(187904K), 0.0067897 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
[GC (Allocation Failure) [PSYoungGen: 6368K->192K(8192K)] 82309K->76149K(187904K), 0.0052315 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
[GC (Allocation Failure) [PSYoungGen: 6336K->1152K(8192K)] 82293K->77117K(187904K), 0.0026567 secs] [Times: user=0.05 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [PSYoungGen: 7296K->1184K(8192K)] 83261K->77157K(187904K), 0.0049316 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
[GC (Allocation Failure) [PSYoungGen: 7202K->1056K(8192K)] 83175K->77037K(187904K), 0.0053079 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
[GC (Allocation Failure) [PSYoungGen: 7181K->912K(8192K)] 83162K->76901K(187904K), 0.0045949 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [PSYoungGen: 7056K->544K(8192K)] 83045K->76557K(187904K), 0.0066989 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 

  • GC日志打印YGC日志非常频繁,几秒钟一次。 PSYoungGen 是使用Parallel Scavenage垃圾收集器的年轻代

  • 从日志上可以看到 7056K->544K(8192K) 年轻代总大小非常小只有8M,这就是产生频繁YGC的原因

  • 当new了一个新对象,Young区内存不够分配时,就会触发一次YGC。

那么为什么Young区会这么小呢?

Jstat查看GC情况

通过 jstat -gc 2668 10000 7 查看GC情况

$   jstat -gc 2668 10000 7
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
2048.0 1024.0  0.0   704.0   5632.0   5504.2   179712.0   80893.3   55552.0 53214.6 6912.0 6470.5   9573   69.553   6      0.593   70.146
2048.0 2048.0  0.0   1184.1  5120.0   911.5    179712.0   80973.3   55552.0 53214.6 6912.0 6470.5   9577   69.573   6      0.593   70.167
2048.0 2048.0 1024.0  0.0    5120.0   1978.0   179712.0   81005.3   55552.0 53214.6 6912.0 6470.5   9580   69.596   6      0.593   70.189
2048.0 2048.0  0.0   224.0   5120.0   3156.5   179712.0   81069.3   55552.0 53214.6 6912.0 6470.5   9583   69.614   6      0.593   70.207
2048.0 2048.0 1216.1  0.0    5120.0   4161.0   179712.0   81125.3   55552.0 53214.6 6912.0 6470.5   9586   69.632   6      0.593   70.225
2048.0 2560.0 1984.0  0.0    4608.0   2132.9   179712.0   81213.3   55552.0 53214.6 6912.0 6470.5   9590   69.660   6      0.593   70.253
3584.0 3584.0 2144.0  0.0    4096.0   2305.9   179712.0   81381.3   55552.0 53214.6 6912.0 6470.5   9594   69.683   6      0.593   70.276

上述结果列含义如下:

EC 表示eden区大小
EU 表示eden区已使用空间大小
S0C 表示 Survival 0 区容量
S1C 表示 Survival 1 区容量
S0U 表示 Survival 0 区已使用空间大小
S1U 表示 Survival 1 区已使用空间大小
相关参数看考文档(java8):https://docs.oracle.com/javase/8/docs/technotes/tools/windows/jstat.html#BEHHGFAE

从上面可以看到,eden区、S0区和S1区大小一直在变化而且并不一定相等,那么为什么堆区大小一直在变化呢?

查了一下发现jvm有个参数UseAdaptiveSizePolicy开启了,该参数是默认开启的,

查看jvm参数:

$ java -XX:+PrintFlagsFinal -version | grep UseAdaptiveSizePolicy
     bool UseAdaptiveSizePolicy                     = true                                {product}

结论

那么可以确定原因基本上是jvm由于开启了UseAdaptiveSizePolicy参数,jvm自动调整堆大小,由于Young区被调整太小导致频繁发生YGC,我们可以通过调整启动参数来避免这种情况。

重新设置启动参数

-XX:+PrintGCDetails -XX:-UseAdaptiveSizePolicy -XX:SurvivorRatio=8 -Xmn100M 

-XX:+PrintGCDetails 启用日志
-XX:-UseAdaptiveSizePolicy 关闭自动跳转堆区大小
-XX:SurvivorRatio=8 设置eden区和survivor区大小比8
-Xmn100M 置Young区大小

参考:

https://docs.oracle.com/javase/8/docs/technotes/tools/windows/jstat.html#BEHHGFAE

标签:8192K,2048.0,0.00,频繁,secs,PSYoungGen,GC,JVM
From: https://blog.csdn.net/qq_36037795/article/details/142188392

相关文章

  • AGC005D ~K Perm Counting 题解
    [AGC005D]~KPermCounting题解如果一个排列\(P\)满足对于所有的\(i\)都有\(|P_i-i|\neqk\),则称排列\(P\)为合法的。现给出\(n\)和\(k\),求有多少种合法的排列。由于答案很大,请输出答案对\(924844033\)取模的结果。\(2\leqn\leq2\times10^3\),\(1\leqk\leqn......
  • JVM四种垃圾回收算法以及G1垃圾回收器(面试)
    JVM垃圾回收算法标记清除算法:标记清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段。在标记阶段通过根节点,标记所有从根节点开始的对象。然后,在清除阶段,清除所有未被标记的对象适用场合:存活对象较多的场景下比较高效缺点:容易产生内存碎片复制算法:从根节点进行扫描,......
  • 【SpringCloud】黑马微服务学习笔记
    目录1.关于微服务 1.1微服务与单体架构的区别 1.2SpringCloud技术2.学习前准备 2.1环境搭建 2.2熟悉项目3.正式拆分 3.1拆分商品功能模块 3.2拆分购物车功能模块4.服务调用 4.1介绍 4.2RustTemplate 的使用4.3服务治理-注册中心4.4服务......
  • SpringCloud生态体系介绍
    SpringCloud是一系列框架的有序集合。它利用SpringBoot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、智能路由、消息总线、负载均衡、断路器、数据监控等,都可以用SpringBoot的开发风格做到一键启动和部署。SpringCloud3要求JDK最低版本为OpenJDK......
  • 学习笔记JVM篇(三)
    一、垃圾回收机制垃圾回收(GarbageCollection)机制,是自动回收无用对象从而释放内存的一种机制。Java之所以相对简单,很大程度是归功于垃圾回收机制。(例如C语言申请内存后要手动的释放)优点:简化了开发难度,同时让内存分配更合理。缺点:屏蔽了底层,同时垃圾回收也会在一定程度上......
  • [AGC004C] AND Grid
    题意给定一张黑白网格图,每个格子有两个颜色,保证边界没有黑色。你需要另外构造两张网格图,使得两张黑色格子四联通,且两个网格黑色的交刚好等于原图。\(n\le500\)。Sol很好玩的构造题。注意到边界没有黑色格子。不难往这个方向想:先染满,使用某种方式将整张图分成两半,这样满足......
  • 解码3D数字人及AIGC产品,如何赋能医美行业全场景业务增长
    9月13日,第六届“医美小小聚”暨医美信息与服务创新发展大会在热烈的氛围中拉开帷幕。此次盛会汇聚了医美行业的顶尖精英与前瞻者,他们围绕“聚焦营销,合规增长,融合共创”的主题,深入剖析了行业的新趋势、新机遇与新挑战。在这场前瞻观点与前沿技术的碰撞中,魔珐科技凭借领先的3D数......
  • Exgcd 和 Excrt 的一些推导
    Exgcd和Excrt的一些推导ExgcdExgcd是用来求解二元一次不定方程的算法,即\[ax+by=c\]根据贝祖定理,该方程有解当且仅当\(\gcd(a,b)\midc\),所以只用求解\[ax+by=\gcd(a,b)\]又因为\[\gcd(a,b)=\gcd(b,a\bmodb)\]可以先求解\[bx'+(a\bmodb)y'=\gcd(a,b)\]变形得\[......
  • 数业智能心大陆探索生成式AIGC创新前沿
    近日,数业智能心大陆参与了第九届“创客中国”生成式人工智能(AIGC)中小企业创新创业大赛。在这场汇聚了众多创新力量的研讨过程中,广东数业智能科技有限公司基于多智能体的心理健康技术探索与应用成果,从众多参赛者中脱颖而出。彰显了公司在技术创新领域的深厚实力,也为其在心理健康科......
  • jvm 自定义dns
    对于jvm进行自定义dns可以解决不少问题(比如特定系统需要一个额外的域名改写,但是并不希望进行全局修改)对于java1.4-8我们是可以直接进行dns配置的(系统属性就可以了),之后的版本就不行了,具体参考dnsjava的说明实际配置参考配置-Dsun.net.spi.nameservice.provider.1=dns,sun-D......