如何诊断Java中的内存泄露
2015-12-05 13:30:21 | 来源:玩转帮会 | 投稿:佚名 | 编辑:小柯

原标题:如何诊断Java中的内存泄露

每次我怀疑有内存泄漏时,我都要翻箱倒柜找这些命令。所以,这里总结一下以备后用:

首先,我用下面的命令监视进程:

while ( sleep 1 ) ; do ps -p $PID -o %cpu,%mem,rss  ; done

(如果有的话还有New Relic)

如果你看到内存上升很快,可能是因为虚拟机设置。如果你没有明确指定JVM的内存设置,它将设置默认值给他们。要获得默认值,使用以下命令:

java -XX:+PrintFlagsFinal -version | grep -i HeapSize

如果这些都不符合你所希望的,那么你就需要指定JVM的内存设置。可以用下面的命令设置最小和最大堆大小:

java -Xms128m -Xmx256m

尽管你有了合理的内存设置,也可以监控进程,但你仍然可能看到内存随时间增加。为了进一步探究原因,你可以使用下面的命令查看对象实例的直方图:

jmap -histo $PID

如果仍然没有足够的信息,那么可以用以下命令进行堆转储:

jmap -dump:format=b,file=/tmp/dump1.hprof $PID

通常,我会用两个堆转储,然后使用下面的jhat命令比较它们:

jhat -baseline /tmp/dump1.hprof /tmp/dump2.hprof

这个命令会启动一个HTTP服务器,你可以用它来探索这两个堆转储之间的差值。在默认情况下,HTTP服务器启动7000端口,你可以在浏览器中访问该端口。

如果你有防火墙,可以通过SSH访问,那么你可以通过如下命令连接该端口:

ssh -L 7000:localhost:7000 $HOST

向下滚动到第一页的底部,你会看到两个有用的链接:

  • Show heap histogram
  • Show instance counts for all classes (excluding platform)

这将给你展示在不同堆转储之间所有“新”的实例,应该对你检测泄漏来自哪里有些帮助。截图如下:

然后你就拥有了一个神奇命令行的快速查看目录,以便于你需要诊断内存泄漏时使用(然而我总是忘记)。

tags:

上一篇  下一篇

相关:

眼睛总发痒,到底是为什么?

一觉起来,发现眼睛又红又肿、又痒又疼,我们的第一反应是去看医生。事实上,许多眼睛症状其实自己在家就能

少女体育课猝死,是谁的错?

少女体育课猝死媒体报道,2015年11月26日下午,湖南祁阳县四中初三名叫刘丝的14岁女生在体育课时猝死。根据

如何配置全世界最小的MySQL服务器

配置全世界最小的 MySQL 服务器——如何在一块 Intel Edison 为控制板上安装一个 MySQL 服务器。介绍在我最

蒋介石也炒过股?

根据周枕琴(曾任国民政府军政部军需署长)孙子周宏涛的说法,辛亥革命之后,因为革命经费十分困难,孙中山

15个实用的PHP正则表达式

对于开发人员来说,正则表达式是一个非常有用的功能,它提供了 查找,匹配,替换 句子,单词,或者其他格式

在这个满是辐射的世界里,儿子失踪老婆死,我却天天捡垃圾

【多图慎点】1.钻石城的旅馆里有这么一个夹食物机好多人说这个是摆设,根本夹不出来然后我幸运 10 的角色执

有些手机倒过来,能看到文字的彩边

这可能是次像素渲染(subpixel rendering)的效果。换言之,文字的「彩边」是故意的。先从计算机图形显示的

PHP代码规范的10个好习惯

  PHP被称为 dirty but quick 的编程语言。尽管在其它编程语言使用者看来,PHP 程序并不简洁美观,但是我

提升运营效率的10款工具

决定运营人员工作效率的因素有很多:能力、经验、直属领导决策力等,但其实还有一个很重要的因素会决定你的

那些儿时的青梅竹马,最后总是没有在一起

虽然都叫做「青梅竹马」,但是其实「青梅竹马」分为两大类:继续系和重逢系。「继续系」顾名思义,就是指自

站长推荐: