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

标签 java memory-management memory-leaks garbage-collection

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

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

谢谢

最佳答案

好主题!

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

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

jstat -gcutil <process_id> <timeout>

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

一旦您发现完整垃圾收集执行得太频繁并且花费太多时间,您就可以假设应用程序正在泄漏内存。

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

jmap -dump:live,format=b,file=heap.bin <process_id>

然后你需要用内存分析器分析heap.bin文件,例如Eclipse Memory Analyzer (MAT)。

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

关于java - 在一次采访中有人问我如何检测 Java 中的内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50881376/

相关文章:

iphone - 不同的内存管理ARC/无ARC

c - 动态分配的堆栈和指针运算出现奇怪的内存错误

c++ - 没有动态内存的内存泄漏

java - 如何提高Java多线程性能?从 NoSQL 数据库(如 Redis)与 ArrayList 保存/加载数据的时间效率?

c# - 抽象类中 'this'的类型与重载方法解析顺序困惑

swift - 如何快速从 View Controller 释放内存

Java RMI tcp 连接内存问题

ios - Cocos2D 库泄露?

java - 你能帮我打印一个用二叉搜索树制作的家谱吗?

java - 如何在 IntegrationFlow 组件上编写单元测试?