java - 内存分析 : How to detect which application/package is consuming too much memory

标签 java jakarta-ee memory-leaks profiling memory-management

我在工作中遇到这样一种情况,我们运行一个 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/

相关文章:

java - @InterceptorBinding/CDI/EJB 3.2 - 注入(inject)问题

java - ejb j2ee 中的持久上下文范围和其他问题

objective-c - 如何在没有内存泄漏的情况下将图像的 NSData 转换为 CGImageRef

java - 在java中显示两个日期之间的小时数

java - 通过 AngularJS 前端输入框获取 Java 中的值

java - 泛型和集合混淆

ios - 内存泄漏 iOS

Java 泛型方法基础知识(反射)

ssl - Weblogic 10.3.2 和 SHA256withRSA 证书签名算法

java - 如何解决android服务泄露错误