在一次采访中,有人问我如何检测 Java 中的内存泄漏?

sho*_*uck 2 java garbage-collection memory-leaks memory-management

我不知道如何回答这个问题。相反,我告诉他们我没有在Web 应用程序中看到任何可能发生内存泄漏的实际代码/情况。我还告诉他,如果创建的对象太多并且这些对象超出范围,GC会负责回收内存。

我的问题是(1)我的回答是否足够好?(2) 能否请您举一个 Web 和/或非 Web 环境中 Java 内存泄漏的实际示例?

谢谢

Pav*_*nov 6

好话题!

您需要先监视 Java 内存消耗。

最简单的方法是使用jstat每个 JVM 附带的实用程序。

jstat -gcutil <process_id> <timeout>
Run Code Online (Sandbox Code Playgroud)

它将报告每一代(Young、Eldery 和 Old)的内存消耗和垃圾收集时间(Young 和 Full)。

一旦您发现 Full Garbage Collection 执行过于频繁并花费太多时间,您就可以假设应用程序正在泄漏内存。

然后您需要使用jmap实用程序创建内存转储:

jmap -dump:live,format=b,file=heap.bin <process_id>
Run Code Online (Sandbox Code Playgroud)

然后您需要使用内存分析器,例如 Eclipse 内存分析器 (MAT) 来分析 heap.bin 文件。

MAT 将分析内存并为您提供有关内存泄漏的可疑信息。