首页 > 其他分享 >记一次使用gdb诊断gc问题全过程

记一次使用gdb诊断gc问题全过程

时间:2023-02-04 18:55:05浏览次数:60  
标签:调用 obj sourceBytes 如下 gdb gc 全过程 序列化

原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。

简介

上次解决了GC长耗时问题后,系统果然平稳了许多,这是之前的文章《GC耗时高,原因竟是服务流量小?》
然而,过了一段时间,我检查GC日志时,又发现了一个GC问题,如下:
image_2023-02-04_20230204143644
从这个图中可以发现,我们GC有一些尖峰,有时会突然有大量的内存分配。

查看GC日志,发现有大对象分配的记录,如下:

$ grep 'concurrent humongous allocation' gc.log | awk 'match($0,/allocation request: (\w+) bytes/,a){print a[1]}' |sort -nr
1941835784
1889656848

image_2023-02-04_20230204143322
可以看到,一次大对象分配,分配大小竟然有1.9G,这谁能抗得住啊!

async-profiler定位大对象分配

上面提到的文章介绍过,使用async-profiler可以很容易的定位大对象分配的调用栈,方法如下:

./profiler.sh start --all-user -e G1CollectedHeap::humongous_obj_allocate -f ./humongous.jfr jps

然后使用jmc打开humongous.jfr文件,调用栈如下:
image_2023-02-04_20230204180005

这是在做thrift反序列化操作,调用了TCompactProtocol.readDouble方法,方法代码如下:
image_2023-02-04_20230204144842
可是,这里只创建了8字节的数组,怎么也不可能需要分配1.9G内存吧,真是奇了怪了!

经过一番了解,这是因为async-profiler是通过AsyncGetCallTrace来获取调用栈的,而AsyncGetCallTrace获取的栈有时是不准的,Java社区有反馈过这个问题,至今未解决。
image_2023-02-04_20230204171551
问题链接:https://bugs.openjdk.org/browse/JDK-8178287

寻找其它tracer

linux上有很多内核态的tracer,如perf、bcc、systemtap,但它们都需要root权限,而我是不可能申请到这个权限的

标签:调用,obj,sourceBytes,如下,gdb,gc,全过程,序列化
From: https://www.cnblogs.com/codelogs/p/17092141.html

相关文章

  • Linux之LVM管理 pvcreate,vgcreate,lvcreate命令
    一、逻辑卷管理(LVM)概念逻辑卷和逻辑卷管理有助于更加轻松地管理磁盘空间。如果托管逻辑卷的文件系统需要更多空间可以将其卷组中的可用空间分配给逻辑卷,并且可以调整文件......
  • mongdb基本概念介绍
    我们通过与关系型数据库的比较来说明MongoDB中的一些概念。SQLMongoDBdatabasedatabasetable(表)collection(集合)row(行)document(文档)column(列)field......
  • gdb操作备忘录
    b main - Puts a breakpoint at the beginning of the programb - Puts a breakpoint at the current lineb N - Puts a breakpoint at line N......
  • 79、缓存---SpringCache---原理与不足
    /***Spring-Cache的不足:*1)读模式:*缓存穿透:查询一个null的数据;====》解决:缓存空数据:spring.cache.redis.cache-null-values=true*缓存击穿:大量并发进......
  • 78、缓存---SpringCache---@CacheEvict
    @CacheEvict(value={"catagory"},key="'OneLevelCategory'")------失效模式例如,当我们修改菜单时,就会删除catagory缓存中的OneLevelCategory缓存如果我们修改......
  • springcloud(一) - 核心组件
    Eureka各个微服务都会注册到Eureka,服务调用时候也会调用Eureka获取服务注册表,功能类似zk。 Feign动态代理的方式,简化请求其他服务的开发成本,更好得对请求地址组装、......
  • 998-搭建一台私用服务器全过程
    服务器U盘安装Ubuntu制作一个Ubuntu安装盘DELL服务器F11进入BOOTManager,选择U盘启动按照安装引导安装即可安装过程中两点分区,根据服务器的用途考虑给多少空间,我这里默认创......
  • Codeforces Round #838 (Div. 2)-D. GCD Queries-GCD、交互
    题目:https://codeforces.com/problemset/problem/1762/D有一个0~n-1的排列,你要在至多2n次询问中找到两个位置x,y,使得\(p_x,p_y\)至少有一者为0.每次询问可以问两个不同的i......
  • codeforces 1047C. Enlarge GCD(数学)
    题意:给出n个数,求出最少删除几个数可以扩大最大公因子。AC代码:#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<set>#include<map>#includ......
  • WGCLOUD简介与特点 - 主机列表中的磁盘使用率是什么
    WGCLOUD监测平台中的模块,【主机列表】的磁盘总使用率百分比和【系统页面】的磁盘空间列表,有时候我们看的时候可能不明白,有什么区别,有什么联系这是因为【主机列表】的磁盘总......