如何检查内存泄漏?

3

不进入代码是否有可能检查内存泄漏。我已经有了该应用程序,并想检查是否存在内存泄漏。

在我的现任组织中,在运行应用程序之前和之后,我会检查cpu使用率以及应用程序进程的cpu使用率。但我认为这不是正确的方法。

请就此向我提供建议。


我们正在处理哪种编程语言? - meder omuraliev
我正在作为一个测试员工作,我必须检查这个应用程序。但这里使用的语言是Java。 - PJ.
3
你为什么要检查 CPU?难道不应该检查内存使用情况吗? - womp
我的意思是说,我过去常常检查进程的内存和CPU使用情况。 - PJ.
操作系统是Solaris,我使用的命令如下: prstat | grep -i <进程ID> ps -ef | grep -i <进程> - PJ.
内存泄漏通常在进程内部,因此当进程终止时,进程中的任何泄漏都将消失。 - Brian Rasmussen
6个回答

8

如果你使用以下标志运行Java应用程序:

-Dcom.sun.management.jmxremote

您可以使用jconsole连接到它。 jconsole是Java自带的工具,位于bin目录中,与java程序在同一处。您可以运行它并随时间观察内存使用情况(虽然不是很好,但可以帮助发现泄漏)。在最新版本的Java(1.6的后期构建)上,您还可以运行类似于jconsolejvisualvm,它还会告诉您有多少个每个类被实例化,这更有用。


+1 我喜欢这种方法...不是那么琐碎,但应该可以简单有效地解决问题! - Yuval
+1 for jvisualvm,它是免费且功能强大的。升级到Java 1.6的另一个好理由。 - Denis Tulskiy

4

1

你说得没错,用Java观察内存并不容易,因为它涉及到垃圾回收,并且会有一种锯齿状的模式。然而,长时间记录整个应用程序的内存消耗可能是有用的。

如果你有一些自动化手段来“远程控制”应用程序(比如在Windows下使用SendKeys),你可以制作漂亮的时间内存消耗图表。使用你喜欢的表格计算程序绘制数据的线性插值。如果这显示出一个正常的上升趋势,你可以说存在泄漏。只有在应用程序不应该增长内存的状态下才这样做,这也可以通过健康的人类思考来完成,思考应用程序需要存储哪些信息以显示/处理数据。

当然,还需要其他工具来深入了解线程或类(请参见其他回答)。


1
分析Java应用程序的内存消耗不应该使用操作系统工具,我个人认为。运行中的JVM将分配一定量的内存,并且即使在给定时间点JVM实际上不需要它,也不太可能释放它。操作系统工具只会报告JVM分配的内存量,而不是JVM内实际提交的内存量。
JDK提供的工具(jstat、jconsole、jvisualvm)更加可靠。在解释内存使用时,最重要的是实际堆的大小。Java应用程序通常会显示锯齿状模式。正在使用的堆的数量会随着时间的推移逐渐增加,并且当GC通过删除所有不再需要的对象来释放堆空间时,会急剧下降。
一个明确的警告信号是缓慢上升的锯齿形:由GC引起的急剧下降每次都会略微高一些。如果应用程序运行时间很长(通常是服务器应用程序),这最终很可能会导致OutOfMemory错误。
另一件要注意的事情是锯齿形状的“牙齿”变得越来越尖和高。这也表明应用程序随着时间的推移需要越来越多的内存。
如果你想分析一个看似的问题的根本原因,你需要分析创建的对象数量并查看它们存在的时间。这不是琐碎的事情。

0

是的,可以检查内存泄漏。 使用Perf工具来检查泄漏。

使用perf探针的示例用法可能是检查libc的malloc()和free()调用:

$ perf probe -x /lib64/libc.so.6 malloc

$ perf probe -x /lib64/libc.so.6 free

已添加新事件: probe_libc:malloc (on 0x7eac0)

已创建一个探针。现在,让我们记录全系统中所有进程在4秒内对malloc和free的全局使用情况:

$ perf record -e probe_libc:malloc -agR sleep 4

$ perf record -e probe_libc:free -agR sleep 4

让我们记录任何进程在4秒内对malloc和free的使用情况:

$ perf stat -e probe_libc:free -e probe_libc:malloc -ag -p $(pgrep $process_name$) sleep 4

输出:

进程ID“1153”的性能计数器统计信息: 11,312 probe_libc:free 11,644 probe_libc:malloc 经过了4.001091828秒的时间
如果每次运行perf命令时malloc和free计数之间的差异增加,这就是内存泄漏的提示。

0

如果是Unix C代码,那就使用Valgrind


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接