为什么char[]存活了这么多代,我应该担心吗?

我是第一次在 NetBeans 中查看分析器,今天早上我注意到,通过监视器分析器显示了 1700 多代幸存的世代,但堆大小保持不变。在阅读时,我发现了这篇文章,其中讨论了如何使用 NetBeans 分析器来发现泄漏。

因此,在遵循文章建议时,我启动了一个内存分析器。在查看结果时,我发现char[]占幸存世代的大多数。截至本文为止,char[]为22代并正在增加。

现在一些帖子(OldCurmudgeon在底部附近的评论)表明,如果我的堆是稳定的,就没有泄漏,但其他人说,如果世代继续增长,就会有泄漏。所以我有点困惑,哪个是对的。

所以,我的问题是:

根据以下屏幕截图,我是否应该进一步调查潜在的内存泄漏?

Memory(Heap)内存(堆)

Memory(GC)内存(GC)

Live allocated objects实时分配的对象


答案 1

这些将被物体持有。它们可以在任何地方出于任何目的创建,例如,探查器和JMX使用它们,因此不执行任何操作的过程将显示这些(以及不断增长的堆)char[]String

注意:所有字符串文本和类等的名称都将保留,直到类加载器被卸载(这可以决定程序的寿命)

要确定堆使用量是否在增长,您应该查看完整 GC 后保留的金额。看看每次凹陷的底部,对我来说看起来都是一样的。其他信息对于性能调优很有用,但本身不是问题。


答案 2

在我的分析过程中,我也遇到了这些挥之不去的char[]。经过长时间的分析,我得出的结论是,其中许多是字符串常量池的char数组。


推荐