一次典型的Memroy Leak的跟踪学习过程
背景
周四时某项目在QQ群里说自己的系统出现了CPU占用较高的情况.
TOP 查看发现大部分占用CPU的都是 JAVA核心进城后附近的进程.
所以初步怀疑 是出现了FullGC的问题.
然后群里反馈了dump 以及 tracelog等内容
进行了简单的分析, 这里总结一下, 备忘
关于GC进程
java -jar 进行启动服务时
第一个进程是核心进程.
第二个一般是 DestroyVM的进程.
然后CPU核心个数的进程一般是GC进程.
查看办法一般为: Top 然后输入 大写 P 按照CPU使用率进行排序.
比如本次给出来的 jstack的处理
进程号是: 89622
然后可以获取 16进制的 编码为: printf +%x 89622
结果为: 15e16
文件搜索 15e17
进程信息为:
"DestroyJavaVM" #487 prio=5 os_prio=0 tid=0x00007f4e2b411000 nid=0x15e17
其他的GC进程为:
"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00007f4f4001f800 nid=0x15e18
因为有 12个CPU 所以就会有12个GC进程.
然后就会再有一个VM的进程
"VM Thread" os_prio=0 tid=0x00007f4f40272000 nid=0x15e25 runnable
然后会有 : Reference Handler 和 Finalizer 以及 Signal Dispatcher 三个JVM的进程
然后后面就是 C1和C2的编译进程了
关于GC进程
大部分可以通过简单的10进制和16进制转换就可以简单看出来 哪些进程有问题.
GC进程多说明堆区存在问题, 有内存泄露或者是大对象, 或者是配置较低.
如果是编译进程较多, 可能是CodeCache存在异常配置.
不同占用CPU的情况是不一样的 可以进行一些简单的分析和定位.
关于dump分析
使用mat分析即可,这个非常简单.
然后打开 dominator tree的方式可以 查看哪些内存占用较多.
也可以直接打开 memory leak detect的来进行判断
本次发现一个比较诡异的数据
org.springframework.data.redis.connection.util.ByteArrayWrapper
这个名称的对象有 四千万个.
占用内存大约 4G左右
感觉打个对象占用100bytes的字节进行计算
4千万*100bytes = 40M*0.1KB = 4GB
与结果完全一致, 基本上发现了内存泄漏的点
然后告诉不重启服务 第二天再次抓取dump
发现内存对象从3.75千万到了4.05千万
工作时间大约也就4个小时不到战胜了 300万行记录
计算一周时间. (40/4)*0.3千万=3千万记录
基本上符合数据的情况. 也明确了内存泄漏的点.
一个另外的思路
抓取dump进行分析需要mat工具并且抓取和下载,以及分析都比较耗时.
感觉这一块 是可以优化的.
然后使用抓取内存对象数目的方式进行验证:
jcmd $pid GC.class_histogram -all >zhaobsh.txt
然后搜索 org.springframework.data.redis.connection.util.ByteArrayWrapper 查看变量数据.
num #instances #bytes class name
3: 33433500 802404000 org.springframework.data.redis.connection.util.ByteArrayWrapper
逐个进行分析
第一个数字 代表他的对象数目排第三位.
第二个数字 代表元素的总数量. 这里面是三千三百万.
第三个数字 是占用的内存大小. (不一定是最终大小.)
这个命令只需要三秒钟就可以查询出结果. 比dump要简单非常多.
感觉可以在操作命令前后进行两次跟踪就可以判断补丁的修改是否凑效了.
一次典型的Memroy Leak的跟踪学习过程的更多相关文章
- oracle问题ORA-00600[729][space leak]
故障现象 ORA-00600: 内部错误代码, 参数: [729], [33600], [space leak], [], [], [], [], [], [], [], [], [] 故障分析 根据 ...
- 如何排查Java内存泄漏?看完我给跪了!
没有经验的程序员经常认为Java的自动垃圾回收完全使他们免于担心内存管理.这是一个常见的误解:虽然垃圾收集器做得很好,但即使是最好的程序员也完全有可能成为严重破坏内存泄漏的牺牲品.让我解释一下. 当不 ...
- Objective-C Memory Management 内存管理 2
Objective-C Memory Management 内存管理 2 2.1 The Rules of Cocoa Memory Management 内存管理规则 (1)When you c ...
- [译] AR SDK的种类比你想得要多!这里介绍七个棒棒哒
作者:Eddie Offermann 原文:There are dozens more Augmented Reality SDKs than you think! Here are seven gr ...
- ionic之$ionicHistory
$ionicHistory 定义:当用户通过导航栏切换视图页面的时候,ionicHistory起到跟踪视图的作用,类似的浏览器的行为方式,一个ionic应用程序能够保持以前的视图,当前视图,和前视图( ...
- promise-不使用catch出现warning的原因
今天在使用node运行js文件时,返回了下面的错误和警告,警告部分主要是因为使用了promise,但是没有使用catch来捕捉错误.更详细的解释在下面,这是nodejs文档的process模块的一部分 ...
- 阿里开源支持缓存线程池的ThreadLocal Transmittable ThreadLocal(TTL)
功能 在使用线程池等会缓存线程的组件情况下,提供ThreadLocal值的传递功能. JDK的InheritableThreadLocal类可以完成父子线程值的传递. 但对于使用线程池等会缓存线程的组 ...
- hackme.inndy.tw的一些Writeup(5月30更新)
hackme.inndy.tw的一些Writeup(6月3日更新) 原文链接:http://www.cnblogs.com/WangAoBo/p/7706719.html 推荐一下https://ha ...
- TransmittableThreadLocal和@Async优雅的记录操作日志
此文主要讲解: 如何实现操作记录 如何将TransmittableThreadLocal和@Async搭配使用 TransmittableThreadLocal阿里的一个开源组件,为了在使用线程池等会 ...
- 转载-通俗理解BN(Batch Normalization)
转自:参数优化方法 1. 深度学习流程简介 1)一次性设置(One time setup) -激活函数(Activation functions) - 数据预处理(Data Prep ...
随机推荐
- 提升漏洞修复率,DevSecOps真的很有一套
摘要:在业务应用交付规模不断扩大.交付速度不断提高.开发运营场景一体化的大环境下,安全问题你真的重视么? 本文分享自华为云社区<HDC.Cloud2021 | 提升漏洞修复率,DevSecOps ...
- 经典永流传,华为云媒体 AI 让老电影焕发新生
摘要:近日,在华为云TechWave全球技术峰会(人工智能&数据)上,马栏山视频文创产业园首席专家周苏岳受邀发表演讲<经典永流传,媒体 AI 让老电影焕发新生>,分享与华为云原生媒 ...
- DevSecOps软件安全开发实践
摘要:DevSecOps 的理念是将安全防护流程有机地融入传统的 DevOps 流程中,为研发安全提供强有力保证,安全工具支撑研发阶段安全要求落地. 本文分享自华为云社区<DevSecOps软件 ...
- vue2升级vue3:vue3创建全局属性和方法
vue2.x挂载全局是使用Vue.prototype.$xxxx=xxx的形式来挂载,然后通过this.$xxx来获取挂载到全局的变量或者方法 在vue3.x这种方法显然是不行了,vue3中在setu ...
- AI Studio 基本操作
https://aistudio.baidu.com/aistudio/projectdetail/6182202 项目启停 执行和调试 添加代码或文件 运行代码 %cd /home/aistudio ...
- Kubernetes(K8S) 监控 Prometheus + Grafana
监控指标 集群监控 节点资源利用率 节点数 运行Pods Pod 监控 容器指标 应用程序 Prometheus 开源的 监控.报警.数据库 以HTTP协议周期性抓取被监控组件状态 不需要复杂的集成过 ...
- Python 批量制作缩略图
本来想网上下个软件处理下的,给我加了水印,不然就让我升会员,程序员都是薅人家羊毛,哪能被人家薅羊毛 1. 安装组件 (指定国内源,速度快些),带上版本号,最新版本会卡在 XXX(PEP 517) 上. ...
- Java 模拟数据库连接池的实现
前面学习过等待 - 通知机制,现在我们在其基础上添加一个超时机制,模拟从连接池中获取.使用和释放连接的过程.客户端获取连接的过程被设定为等待超时模式,即如果在 1000 毫秒内无法获取到可用连接,将会 ...
- 解读IDC《中国视频云市场跟踪》最新报告,视频云将趋向何方?
国际权威咨询公司IDC发布<中国视频云市场跟踪(2021 H2)>报告,阿里云连续四年稳居中国视频云整体市场份额第一,整体市场份额占比达26.9%. 时至2021,中国视频云的数字背后 近 ...
- AtCoder Regular Contest 120 AB题
比赛链接:Here A - Max Add 观察一下发现每次输出与两点有关,前缀和和当前位置最大值 int main() { cin.tie(nullptr)->sync_with_stdio( ...