我第一次在NetBeans中检查了分析器,我今天早上已经注意到,通过Monitor分析器显示了超过1700个幸存的代,但是堆大小不变。在进行一些阅读时,我发现this article讨论了使用NetBeans探查器来发现泄漏。
因此,在关注文章建议后,我开始了一个内存分析器。在查看结果时,我发现char []占了大多数幸存的世代。目前,在这篇文章中,char []已经22代了。
现在有些posts (comment by OldCurmudgeon near the bottom)表示如果我的堆稳定没有泄漏,yet others说如果世代继续增长,那就是。所以我有点困惑,哪个是对的。
所以,我的问题是:
根据以下屏幕截图,我是否应该进一步研究潜在的内存泄漏?
存储器(堆)
存储器(GC)
实时分配的对象
答案 0 :(得分:8)
char[]
可能由String
个对象保留。它们可以在任何地方创建,例如,分析器和JMX使用它们,因此一个什么都不做的过程将显示这些(以及不断增长的堆)
注意:所有字符串文字和类等的名称将一直存在,直到卸载ClassLoader(这可以是程序的生命周期)
要确定您的堆用途是否在增长,您应该查看完整GC后保留多少。看看每次下降的底部,它对我来说都是一样的。其他信息对性能调优很有用,但本身并不是问题。
答案 1 :(得分:2)
在我的成绩中我也遇到了这些挥之不去的char []。经过长时间的分析后,我得出结论,其中许多是String常量池的char数组。
答案 2 :(得分:2)
不看代码,无法分辨。有一些程序使用TB内存,它们运行良好,因为它不是内存泄漏,它只是程序的工作方式。
Netbeans documentation只定义幸存的是什么,而不是如何使用该数字来发现内存泄漏。此外,char[]
只是String
的内容,并且可以保留很长时间(甚至与主线程一样长)。
找到泄漏没有灵丹妙药。您应该在可行的负载下运行程序,并查看内存使用情况是否与预期模式一致。如果不是,那么你有一个问题,但没有任何上下文,图表没有任何意义。