【发布时间】:2010-07-26 11:04:56
【问题描述】:
我有一个在 JBoss 上运行的 J2EE 项目,最大堆大小为 2048m,这在负载测试下给出了奇怪的结果。我已经对堆和 cpu 使用率进行了基准测试,并收到了以下结果(系列 1 是堆使用率,系列 2 是 cpu 使用率):
似乎堆被正确使用并在 A 周围正确收集垃圾。然而,当它到达 B 时,似乎存在某种瓶颈,因为有可用的堆空间,但它永远不会打破这个想象线。同时,在 C 处,cpu 使用率急剧下降。在此期间,我们还会收到“OutOfMemoryError(超出 GC 开销限制)”,这对我来说没有多大意义,因为有可用的堆空间。
我的猜测是存在某种瓶颈,但我什至无法想象到底是什么。您建议如何寻找问题的原因?我分析了内存使用情况并注意到一个类有很多实例(大约一百万),但这些实例的总大小相当小(如果我没记错的话大约 50MB)。
编辑:服务器专用于此应用程序,并且给定的 CPU 使用率仅适用于 JVM(在 JVM 之外不应有任何显着的 CPU 使用率)。内存使用仅用于堆,不包括 permgen 空间。这个问题是可以重现的。我主要关心的是围绕 B 遇到的限制,对此我还没有找到合理的解释。
结论:原来这是由一堆长时间运行的 SQL 查询同时调用造成的。返回的 ResultSets 也非常大,可能解释了 OOME。我仍然没有合理的解释为什么 B 似乎有一些限制。
【问题讨论】:
标签: performance jakarta-ee heap-memory profile