一次典型的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 ...
随机推荐
- 云图说丨初识数据工坊DWR
摘要:数据工坊DWR是一款近数据处理服务,通过易用的工作流编排和开放生态的数据处理算子,能够在云上实现图像.视频.文档.图片等数据处理业务. 本文分享自华为云社区<[云图说]第236期 初识数据 ...
- Solon Aop 特色开发(2)注入或手动获取Bean
Solon,更小.更快.更自由!本系列专门介绍Solon Aop方面的特色: <Solon Aop 特色开发(1)注入或手动获取配置> <Solon Aop 特色开发(2)注入或手动 ...
- C# 完美实现物联网 MQTT 数据通信
前言 MQTT 协议由于其用极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务,具有开销低.占用带宽低.即时通讯等优点,使其在物联网.小型设备.移动应用等方面有较广泛的应用,在工业物联网中, ...
- BBS项目(一):BBS需求分析 数据表设计 注册登录功能实现
目录 BBS需求分析 数据表设计 注册页面前端 上传头像 提交数据 FormData 注册后端逻辑 接受参数 验证参数 数据入库 密码加盐操作 返回数据 登录页面前端 生成验证码 前端提交数据 登录后 ...
- #2066:一个人的旅行(Dijkstra算法入门题)
一个人的旅行 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- # 2027 ( 统计元音 ) :hash应用
Problem Description 统计每个元音字母在字符串中出现的次数. Input 输入数据首先包括一个整数n,表示测试实例的个数,然后是n行长度不超过100的字符串. Output 对于每个 ...
- Codeforces Round #730 (Div. 2) A~D题个人题解
比赛链接:Here 1543A. Exciting Bets math, 给定两个数字 \(a,b (a,b \le 1e18)\) 和以下两种操作: \(a + 1,b+1\) \(a-1,b-1\ ...
- 广州|阿里云 Serverless 技术实战营邀你来玩!
活动简介 "Serverless 技术实战与创新沙龙 " 是一场以 Serverless 为主题的开发者活动,活动受众以关注Serverless 技术的开发者.企业决策人.云原生领 ...
- java进阶(16)--System常用方法总结
一.Systen.out静态变量 静态变量,用的最多的是调用print方法 二.System.out.println() println()其实是printStream类的方法 三.Sytem ...
- C++ 利用模板偏特化和 decltype(()) 识别表达式的值类别
刚刚看到一篇 C++ 博客,里面讲到用模板偏特化和 decltype() 识别值类别:lvalue glvalue xvalue rvalue prvalue.依照博客的方法试了一下,发现根本行不通. ...