一个java内存泄漏的排查案例
这是个比较典型的java内存使用问题,定位过程也比较直接,但对新人还是有点参考价值的,所以就纪录了一下。
下面介绍一下在不了解系统代码的情况下,如何一步步分析和定位到具体代码的排查过程
(以便新人参考和自己回顾)
初步的现象
业务系统消费MQ中消息速度变慢,积压了200多万条消息,通过jstat观察到业务系统fullgc比较频繁,到最后干脆OOM了:
进一步分析
既然知道了内存使用存在问题,那么就要知道是哪些对象占用了大量内存.
很多人都会想到把堆dump下来再用MAT等工具进行分析,但dump堆要花较长的时间,并且文件巨大,再从服务器上拖回本地导入工具,这个过程太折腾不到万不得已最好别这么干。
可以用更轻量级的在线分析,用jmap查看存活的对象情况(jmap -histo:live [pid]),可以看出HashTable中的元素有5000多万,占用内存大约1.5G的样子:
定位到代码
现在已经知道了是HashTable的问题,那么就要定位出什么代码引起的
接下来自然要看看是什么代码往HashTable里疯狂的put数据,于是用神器btrace跟踪Hashtable.put调用的堆栈。
首先写btrace脚本TracingHashTable.java:
import com.sun.btrace.annotations.*; import static com.sun.btrace.BTraceUtils.*;@BTrace public class TracingHashTable {/*指明要查看的方法,类*/@OnMethod(clazz="java.util.Hashtable",method="put",location=@Location(Kind.RETURN))public static void traceExecute(@Self java.util.Hashtable object){println("调用堆栈!!");jstack();} }
然后运行:
bin/btrace -cp build 4947 TracingHashTable.java
看到有大量类似下图的调用堆栈
可以看出是在接收到消息后查询入库的代码造成的,业务方法调用ibatis再到mysql jdbc驱动执行statement时put了大量的属性到HashTable中。
通过以上排查已基本定位了由那块代码引起的,接下来就是打开代码工程进行白盒化改造了,对相应代码进行优化(不在本文范围内了。几个图中的pid不一致就别纠结了,有些是系统重启过再截图的).
本文永久链接: http://jenwang.me/14853486232080.html
转载于:https://www.cnblogs.com/huanglog/p/10304949.html
一个java内存泄漏的排查案例相关推荐
- Java内存泄漏的排查
1.内存溢出 一种通俗的说法. 1.内存溢出:你申请了10个字节的空间,但是你在这个空间写入11或以上字节的数据,出现溢出. 2.内存泄漏:你用new申请了一块内存,后来很长时间都不再使用了(按理应该 ...
- 一次 Java 内存泄漏的排查
由来 前些日子小组内安排值班,轮流看顾我们的服务,主要做一些报警邮件处理.Bug 排查.运营 issue 处理的事.工作日还好,无论干什么都要上班的,若是轮到周末,那这一天算是毁了. 不知道是公司网络 ...
- jstat 内存泄漏_一次Java内存泄漏的排查!要了自己的老命!
点击上方"Java之间",选择"置顶或者星标" 你关注的就是我关心的! 作者:枕边书 来源:https://zhenbianshu.github.io 一.由来 ...
- java 内存泄露对象排查_记录一次 java内存泄漏的排查
1.问题:jar进程会随着时间由 30% 上涨到 70% 直到虚机报警.重启过后,还是会缓慢上涨: 进程数也在上涨: 2.在排查内存问题时,可能会使用的命令 1)查看 java 进程:jps -l 可 ...
- 分享一次 Java 内存泄漏的排查
由来 前些日子小组内安排值班,轮流看顾我们的服务,主要做一些报警邮件处理.Bug 排查.运营 issue 处理的事.工作日还好,无论干什么都要上班的,若是轮到周末,那这一天算是毁了. 不知道是公司网络 ...
- java内存泄漏问题排查
背景:程序部署在客户机器上,不定期异常崩溃,且无日错误异常日志记录. day1:初步排查是内存问题导致的,考虑使用分析工具记录分析.另外代码review仔细排查,怀疑有可能跟大量网络socket没有释 ...
- 一次恐怖的 Java 内存泄漏排查实战
转载自 一次恐怖的 Java 内存泄漏排查实战 最近在看<深入理解Java虚拟机:JVM高级特性与最佳实践>(第二版)这本书,理论+实践结合,深入浅出,强烈推荐给大家. 这两天对JVM内 ...
- 什么是内存泄露?该怎么排查?Java内存泄漏策略
什么是内存泄漏 内存泄漏:对象已经没有被应用程序使用,但是垃圾回收器没办法移除它们,因为还在被引用着. 在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点,首先,这些对象是可达的, ...
- java内存泄漏总结
内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题.内存泄漏大家都不陌生了,简单粗俗的讲,就是该被释放的对象没有释放,一直被某个或某些实例所持有却不再被使用导致 GC 不能回收 ...
- Java内存泄漏分析和解决
1. 什么是内存泄漏? 内存泄漏:对象已经没有被应用程序使用,但是垃圾回收器没办法移除它们,因为还在被引用着. 在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点,首先,这些对象是 ...
最新文章
- HTTP详解(1)-工作原理【转】
- # 2017-2018-1 20155224 《信息安全系统设计基础》第九周学习总结
- 关于Sqlite的一个demo
- Qt5学习笔记之串口助手四:增加16进制/ASCII切换、周期发送
- 服务器硬盘检测工具有哪些,最常用的10大服务器管理工具
- 领域驱动架构(DDD)建模中的模型到底是什么?
- 傅里叶变换的性质(一)
- Google员工的工作环境
- idea当中批量替换变量名字
- 【毕设项目】新闻推荐平台功能详解----新闻推荐系统
- python3爬取微博评论api情感分析_如何科学地蹭热点:用python爬虫获取热门微博评论并进行情感分析...
- python从国内源下载安装包
- 华为网络精英挑战赛初赛
- bandzip和360解压_最优秀的压缩/解压缩软件—BandZip
- 新闻!牛磨王抗磨网发布超燃猪年贺岁词 | “绿多多”绿色资产资讯
- 自动驾驶学习过程(Apollo)
- codeforces131B
- 哈工大计算机网络第二章——应用层复习
- A Survey on Optical Character Recognition System 光学字符识别系统综述
- PHP“内存位置访问无效”