我正在尝试确定我的webapp中是否有内存泄漏。我正在使用VisualVM和JMeter加载测试并观察堆。
昨天我将堆转储保存到文件并下载了Eclipse Memory Analyzer ...在对VisualVM感到非常沮丧之后,我认为Eclipse会比VisualVM更精确地查明漏洞。
我在Eclipse中打开了堆文件并运行了他们称之为泄漏嫌疑人报告的内容。我认为它会指向我的webapp中的特定类,但事实并非如此。所以我不知道如何使用它提供的信息,以便找出泄漏嫌疑人在我的任何特定类别的位置。
以下是我的一个堆转储文件的泄漏可疑报告的结果。
One instance of "org.apache.catalina.session.StandardManager" loaded by "org.apache.catalina.loader.StandardClassLoader @ 0x261bdac0" occupies 16,977,376 (48.54%) bytes. The memory is accumulated in one instance of "java.util.concurrent.ConcurrentHashMap$Segment[]" loaded by "". Keywords org.apache.catalina.loader.StandardClassLoader @ 0x261bdac0 org.apache.catalina.session.StandardManager java.util.concurrent.ConcurrentHashMap$Segment[]
报告中的其余详细信息如附图所示。我希望可以扩展图像以便仔细观察....
我知道Eclipse应该是非常好的软件。这是我最后一次尝试使用这样的东西来查找内存泄漏 - 我对这个软件如何用于此类知识的知识非常非常有限。教程和帮助页面描述了一些事情,好像你应该知道在点击几下后该做什么......我需要更多的帮助。
答案 0 :(得分:4)
虽然我没有使用Eclipse查找泄漏的经验,但我先问一个问题:你有多确定内存泄漏?从您的问题来看,这听起来并不像您确定您有泄漏,但您正在测试是否确实有泄漏。最简单的测试方法是启动你的应用程序,注意它消耗了多少内存,让JMeter连续24小时点击它,并查看它消耗了多少内存(可能在执行GC之后)。如果您的应用程序消耗了相当大的内存,或者已经死于OutOfMemoryError
,那么您就会发生内存泄漏。
如果您发现实际上确实存在内存泄漏,那么我首先会建议您通过FindBugs运行您的应用程序,以查看它是否可以通过快速静态分析找到内存泄漏。如果这不起作用,那么this article(尽管它相当陈旧)可能有助于您理解Eclipse给您的结果。