美文网首页程序员Java学习笔记
排查内存泄漏你需要知道的套路

排查内存泄漏你需要知道的套路

作者: 杰克熊 | 来源:发表于2017-04-06 22:28 被阅读421次

内存泄漏是一个比较棘手的问题,大多数时候没有明显的报错,这给问题排查带来很大困难,好在前人已经遇到很多类似问题,也留下了一些典型的排查套路,大部分时候只需要按图索骥,一步步来即可。

套路之工具篇

  • ps或者jps
    ps:查找活跃的进程
    典型用法:ps -ef|grep java
    jps:查找活跃的 java进程*
    典型用法:jps -v
  • jmap
    jmap 可以将java内存打印出来,作为内存分析工具(如MAT)的输入
  • jinfo
    可以用来查看java进程的启动信息,可以看下内存堆大小的设置
  • jstat
    可以用来打印JVM的运行时GC统计信息, 典型用法如
    jstat -gcutil 21891 250 2
    表示链接到21891这个进程,每250ms用gcutil打印一次,一共取2个实例,通常打印出来的效果是这样的
$ jstat -gcutil 19677 1000 2
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT
 85.04   0.00  15.15   3.61  44.32      4    0.834     1    0.705    1.538
 85.04   0.00  15.15   3.61  44.32      4    0.834     1    0.705    1.538

PS:如果命令有任何不清楚,男人(man)是你的好朋友:)

套路之实战篇

1. 获取内存dump

进程还活着:

  • 使用ps查找java进程ID
    ps -ef|grep java 或者 jps
  • jmap 将内存dump到本地
    jmap -dump:live,format=b,file=dump.bin 19677
    会输出dump.bin文件

已经OOM挂了:

提前在java 运行参数添加 -XX:+HeapDumpOnOutOfMemoryError 表示挂了需要dump当时内存,再添加 -XX:HeapDumpPath=/tmp表示dump内存存放的位置, 这样当应用down掉之后,会输出一个.hprof文件

2. 内存分析

  • 使用MAT导入上一步生成的dump文件,分析之后你会看到类似这样一张图
1.png

从这里为入口,可以查看哪些对象占用内存较大,内存泄漏的可疑点在哪里,比如这个case, 点到Leak Suspects这个链接可以看到

2.png

这是个比较直观的问题,HashMapEntry对象占用了超过99%的内存空间,可以直接看业务代码哪里HashMap使用出了问题。
这是MAT比较简单的应用,其他高级用法可以看MAT官方文档,或这篇文章 Java程序内存分析:使用mat工具分析内存占用 - 孤剑 - 博客园

结语

相信了解了这些工具与套路,下次遇到可疑内存泄漏或者OOM这样的严重问题,就不会茫然无措了。

相关文章

  • 排查内存泄漏你需要知道的套路

    内存泄漏是一个比较棘手的问题,大多数时候没有明显的报错,这给问题排查带来很大困难,好在前人已经遇到很多类似问题,也...

  • 使用 Memory Profiler 排查内存泄露

    使用 Memory Profiler 排查内存泄漏 内存泄漏和内存溢出 **Memory Profiler **是...

  • Android如何打造高质量的应用?( 三)

    内存泄漏内存泄漏简单来说就是没有回收不再使用的内存,排查和解决内存泄漏也是内存优化无法避开的工作之一。很多内存泄漏...

  • iOS 内存泄漏排查方法及原因分析

    本文将从以下两个层面解决iOS内存泄漏问题: 内存泄漏排查方法(工具) 内存泄漏原因分析(解决方案) 在正式开始前...

  • 四、垃圾收集器与内存分配策略

      为何需要了解GC和内存分配呢?当需要排查各种内存溢出、内存泄漏问题时;当垃圾收集成为系统达到更高并发量的瓶颈时...

  • Linux下内存泄漏排查

    作为c的程序员,最常见的就是排查内存泄漏,不过我们一般的内存泄漏是针对特定的程序去排查,相对来说比较容易,但是如果...

  • 垃圾收集器和内存分配策略

    GC需完成的三件事: 那些内存需要回收 什么时候回收 如何回收 为什么要了解GC和内存分配? 当需要排查内存泄漏和...

  • JDK的bin下的工具有哪些功能

    Java生产环境下问题排查 Java内存泄漏分析系列之一:使用jstack定位线程堆栈信息 Java内存泄漏分析系...

  • 垃圾收集基础概念

    一、概述 1.为什么要了解GC 当需要排查各种内存溢出、内存泄漏问题时,当GC成为系统达到高并发量的瓶颈时,就需要...

  • JAVA垃圾回收机制

    为什么要了解垃圾回收?当需要排查各种内存溢出、内存泄漏问题,当垃圾收集成为系统达到更高并发量的瓶颈时,就需要进行必...

网友评论

    本文标题:排查内存泄漏你需要知道的套路

    本文链接:https://www.haomeiwen.com/subject/zfkcattx.html