程序员Java学习笔记

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

2017-04-06  本文已影响421人  杰克熊

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

套路之工具篇

$ 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

进程还活着:

已经OOM挂了:

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

2. 内存分析

1.png

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

2.png

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

结语

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

上一篇 下一篇

猜你喜欢

热点阅读