LoginSignup
0
0

More than 5 years have passed since last update.

诊断Java中的内存泄露

Last updated at Posted at 2015-12-15

原文:https://dzone.com/articles/diagnosing-memory-leaks-in-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
注:Java8开始Permanent取消,改成MetaSapce

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

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访问,那么你可以通过如下命令连接该端口:

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0