今天刚刚才加一个故障review会议, 故障非常典型, google下也可以找到相似案例介绍。 在排查问题的过程中,使用了大量的工具, 发现有问题的地方还不只一个,总结一下. (本篇文章不会重点描述案例本身,重点会介绍个人对java内存泄露问题的排查思路和各种工具的使用)。

java内存泄露典型特征

现象一:堆/Perm 区不断增长, 没有下降趋势(回收速度赶不上增长速度), 最后不断触发FullGC, 甚至crash(如下两张图是同一个应用的GC和Perm数据, GC触发原因确认是Perm不足)
. 一般是现象二的晚期表现.

现象二:每次FullGC后, 堆/Perm 区在慢慢的增长, 最后不断触发FullGC, 甚至crash(如下图: 示意图)

java内存泄露场景---PermGen space

原因:说明Perm不足. Perm存放class,method相关对象,以及运行时常量对象. 如果一个应用加载了大量的class, 那么Perm区存储的信息一般会比较大.另外大量的intern String对象也会导致Perm区不断增长。 此区域大小由-XX:MaxPermSize参数进行设置. (jdk8相关参数已经改变, 这里不讨论)

案例:Groovy动态编译class, xstream String.intern

本质原因:ClassLoader.defineClass和java.lang.String.intern在大量不适宜的场景被调用.

解决方案:

方案1(直接有效): 使用btrace相关工具输出调用ClassLoader.defineClass栈信息, 从栈信息来追溯问题. (代码如下图). 但Btrace 不能trace jvm native方法(官方releasebtrace 1.3.1中版本声明可以trace native方法, 但尝试无效。如果你清楚如何使用,麻烦告知一下,谢谢).

![_2016_09_29_12_59_38](http://ata2-img.cn-hangzhou.img-pub.aliyun-inc.com/c5bbdd783fb0606a9817c8296babce42)* **用JProfiler来trace String.intern方法栈复制代码

方案2: dump heap, 看看哪些class有异常现象(数量),String被Perm区引用的对象信息等.但这种方式不太直观,可以从String数据看看发现可疑问题,没有方案1直观。(如下图: 如果能在日常调试推荐JProfiler**)

![_2016_09_29_1_46_59](http://ata2-img.cn-hangzhou.img-pub.aliyun-inc.com/8e5d32f29e6166695ea976ae8f9ba89d)复制代码

方案3: 增加-XX:+TraceClassLoading和-XX:+TraceClassUnloading, 看看哪些class加载了,哪些class卸载了. 如果一些特殊的class一直被加载而没有被卸载说明也是有问题的。(如下图)


![_2016_09_29_1_06_46](http://ata2-img.cn-hangzhou.img-pub.aliyun-inc.com/b826a15b81570c02590fda7e598100cd)复制代码

方案4:执行jmap-permgen(jstat -gcutil 可以查看内存增长速度和区域)命令看看Perm区中的内容, 初步确定是否存在问题 (如下图)

java内存泄露场景---Java heap space

原因:长生命周期的对象引用了短生命周期(应该尽快GC回收掉)的对象,最后造成一个对象已经不能在堆区分配足够空间. 注: 这种现象不能完全肯定是内存泄露, 比如: heap本身的设置的过小.

案例:我个人没有遇到过这种案例, 但模拟过这种情形的Demo: 参考我的《深入浅出JProfiler》文章, 也学习过其他同学的案例: 例如:参数过大并且频繁超时导致内存泄露

解决方案:

触发FullGC, dump live heap. 标记堆中对象数量, 重点关注可疑对象

触发FullGC, dump live heap. 标记堆中对象数量, 重点关注可疑对象

对比步骤1和步骤2 相同对象的数量和大小, 找出可疑对象一一进行排查确认。

如果步骤3依然无法明确有问题的对象, 那就多执行几次步骤1和步骤2。 在此过程中可以调整GC触发时间, 模拟真实的故障场景 :)

看看GC后堆的大小是否增长, 如果没有不断增长, 并且持续一段较长时间, 那基本正常(具体看看深入浅出JProfiler文章中的实践章节)。

注: Java内存泄露的场景还有很多(可以参考下官方的一些文档java memleaks), 有机会后面会继续补充.

如何排查Java内存泄露(内附各种排查工具介绍)相关推荐

  1. java内存泄露分析方案

    java内存泄露分析方案 - 准备工作 1.工具:Memory Analyzer Tool (mat); 1)安装Memory Analyzer Tool (mat) 2.原料:dump.hprof ...

  2. Java内存泄露的理解与解决

    Java内存管理机制 在C++语言中,如果需要动态分配一块内存,程序员需要负责这块内存的整个生命周期.从申请分配.到使用.再到最后的释放.这样的过程非常灵活,但是却十分繁琐,程序员很容易由于疏忽而忘记 ...

  3. java线程泄露_面试官:小伙子先来说一下可能引起Java内存泄露的场景吧

    原标题:面试官:小伙子先来说一下可能引起Java内存泄露的场景吧 本文分析一下可能引起java内存泄露的场景: 通过 finalize 方法 终结器finalizers的使用是潜在内存泄漏问题的另一个 ...

  4. Java内存泄露和内存溢出、JVM命令行工具、.JDK可视化工具、Java Class文件

    1.Java内存泄露和内存溢出对比 1.1 Java 内存泄露 内存泄露是指一个不再被程序使用的对象或变量还在内存中占用空间. 1.1.1判断内存空间是否符合垃圾回收的标准 在Java语言中,判断一个 ...

  5. JAVA内存泄露分析和解决方案及WINDOWS自带查看工具

    JAVA内存泄露分析和解决方案及WINDOWS自带查看工具 Java内存泄漏是每个Java程序员都会遇到的问题,程序在本地运行一切正常,可是布署到远端就会出现内存无限制的增长,最后系统瘫痪,那么如何最 ...

  6. java内存泄露有什么后果,Java内存泄露问题是什么?

    很多人在谈论内存泄露问题,当然对于c/c++来说,这个应该是老掉牙的问题,但是很多Java人员也越来越多得讨论这个问题,我这里写个小结,希望对大家有一定的参考价值. 内存泄漏的慨念 1.c/c++是程 ...

  7. Java 内存泄露以及避免方法

    转载自  Java 内存泄露以及避免方法 内存泄露:      是指在程序运行过程中会不断的分配内存空间,那些不再使用的内存空间应该即时回收它们,从而保证可以保证系统可以再次使用这些内存.如果存在无用 ...

  8. Java内存泄露原因详解

    一.Java内存回收机制  不论哪种语言的内存分配方式,都需要返回所分配内存的真实地址,也就是返回一个指针到内存块的首地址.Java中对象是采用new或者反射的方法创建的,这些对象的创建都是在堆(He ...

  9. 检测java内存泄露_MAT 检测 Java内存泄露检测

    一.Java内存泄露例子 Vector v = new Vector( 10 ); for ( int i = 1 ;i < 100 ; i ++ ){ Object obj = new Obj ...

最新文章

  1. MIT请来了一群经济学家,就AI是否会带来大规模失业展开了一场辩论
  2. [转]verilog语法学习心得
  3. 程序员必备技能-科学砍需求
  4. JAVA并发-从缓存一致性说volatile 讲的很好
  5. wxWidgets 富文本编辑器示例
  6. URAL 1022 Genealogical tree
  7. 点击显示底框颜色,默认显示第一个。
  8. /etc/profile、/etc/bashrc、~/.bash_profile、~/.bashrc和~/.bash_logout
  9. 使用Swagger UI的Document和Test API
  10. CentOS 7 根目录分区扩容
  11. 数字电子技术基础第5版笔记和课后习题答案 阎石
  12. PDF拆分页面,免费拆分为多个PDF
  13. 深入C++库分析sync_with_stdio实现
  14. html中的换行符也占空间,如何解决
  15. python图像平移,Python 图像扩充之旋转、平移、缩放、裁剪
  16. springboot 自定义starter
  17. 漫步者蓝牙自动断开_情人节礼物 就连宋轶都推荐的高颜值真无线蓝牙耳机
  18. 切面条/猜字母/大衍数列/奇怪的分式
  19. python时间戳转日期格式(保留毫秒级别)
  20. Oracle数据库迁移11g到19c

热门文章

  1. 验证码生成php代码,一个php验证码生成类代码
  2. 【SQL练习题】1. 多列数据求最大值
  3. 【PostgreSQL-9.6.3】psql常用命令
  4. C#使用SmtpClient发送邮件解决授权码配置问题
  5. 具有左,中或右对齐项的Bootstrap NavBar
  6. 如何在Python中解析XML?
  7. win11怎么退回win7 Windows11退回win7的步骤方法
  8. 安卓9.0系统新特性
  9. pdf模板工具JaspersoftStudio,JasperReport
  10. C++ 如何画橡皮线