我在这里遇到一种情况,我们运行的Java EE服务器上部署了多个应用程序.最近,我们经常遇到OutOfMemoryException.我们怀疑某些应用程序可能表现不佳,可能是泄漏,或者其他什么.
问题是,我们无法确定哪一个.我们已经运行了一些内存分析器(比如YourKit),并且它们非常善于告诉哪些类使用最多的内存.但是它们没有显示类之间的关系,所以这给我们留下了这样的情况:我们看到有很多字符串和int数组以及HashMap条目,但是我们无法确定它们是哪个应用程序或包来自.
有没有办法知道这些对象来自哪里,所以我们可以尝试查明分配最多内存的包(或应用程序)?
解决方法:
在这种情况下,有几件事情可以做:
> Configure the Java EE application server to produce a heap dump on OOME.自1.5天起,此功能可通过JVM参数获得.一旦获得转储,就可以使用像Eclipse MAT这样的工具离线分析它.重要的是找出支配树.
>在测试服务器上执行内存分析; Netbeans很擅长这个.在分析根本原因时,这必然需要花费更多时间,因为必须存在内存分配失败的确切条件.如果您确实进行了自动集成/功能测试,那么推断根本原因会更容易.诀窍是定期进行堆转储,并分析导致堆消耗增加的类.可能不一定存在泄漏 – 可能是堆大小不足的情况.
标签:java,memory-management,memory-leaks,profiling,java-ee
来源: https://codeday.me/bug/20190701/1342598.html