我在工作中遇到这样一种情况,我们运行一个 Java EE 服务器,上面部署了多个应用程序。最近,我们经常遇到 OutOfMemoryException。我们怀疑某些应用程序可能表现不佳,可能会泄漏或发生其他问题。
问题是,我们真的无法分辨是哪一个。我们已经运行了一些内存分析器(比如 YourKit),它们非常擅长判断哪些类使用了最多的内存。但是它们没有显示类之间的关系,所以这给我们留下了这样的情况:我们看到有很多 Strings 和 int 数组以及 HashMap 条目,但我们无法真正分辨出它们是哪个应用程序或包来自。
有没有办法知道这些对象来自哪里,以便我们可以尝试查明分配最多内存的包(或应用程序)?
最佳答案
在这种情况下可以做几件事:
- Configure the Java EE application server to produce a heap dump on OOME .自 1.5 天起,此功能可通过 JVM 参数使用。获得转储后,可以使用 Eclipse MAT 等工具对其进行离线分析。 .重要的部分是找出支配树。
- 在测试服务器上执行内存分析; Netbeans擅长这个。在分析根本原因时,这肯定会比第一次花费更多的时间,因为必须存在内存分配失败的确切条件。如果您确实有自动集成/功能测试,那么推断根本原因会更容易。诀窍是定期进行堆转储,并分析导致堆消耗增加的类。可能不一定存在泄漏 - 可能是堆大小不足的情况。
关于java - 内存分析 : How to detect which application/package is consuming too much memory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2953965/