不进入代码是否有可能检查内存泄漏。我已经有了该应用程序,并想检查是否存在内存泄漏。
在我的现任组织中,在运行应用程序之前和之后,我会检查cpu使用率以及应用程序进程的cpu使用率。但我认为这不是正确的方法。
请就此向我提供建议。
不进入代码是否有可能检查内存泄漏。我已经有了该应用程序,并想检查是否存在内存泄漏。
在我的现任组织中,在运行应用程序之前和之后,我会检查cpu使用率以及应用程序进程的cpu使用率。但我认为这不是正确的方法。
请就此向我提供建议。
如果你使用以下标志运行Java应用程序:
-Dcom.sun.management.jmxremote
您可以使用jconsole
连接到它。 jconsole
是Java自带的工具,位于bin
目录中,与java
程序在同一处。您可以运行它并随时间观察内存使用情况(虽然不是很好,但可以帮助发现泄漏)。在最新版本的Java(1.6的后期构建)上,您还可以运行类似于jconsole
的jvisualvm
,它还会告诉您有多少个每个类被实例化,这更有用。
你说得没错,用Java观察内存并不容易,因为它涉及到垃圾回收,并且会有一种锯齿状的模式。然而,长时间记录整个应用程序的内存消耗可能是有用的。
如果你有一些自动化手段来“远程控制”应用程序(比如在Windows下使用SendKeys),你可以制作漂亮的时间内存消耗图表。使用你喜欢的表格计算程序绘制数据的线性插值。如果这显示出一个正常的上升趋势,你可以说存在泄漏。只有在应用程序不应该增长内存的状态下才这样做,这也可以通过健康的人类思考来完成,思考应用程序需要存储哪些信息以显示/处理数据。
当然,还需要其他工具来深入了解线程或类(请参见其他回答)。
是的,可以检查内存泄漏。 使用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秒的时间如果是Unix C代码,那就使用Valgrind