为什么char[]在许多代中仍然存活,并且我是否应该担心?

17
我第一次在NetBeans中使用分析器,并且今天早上通过监视器分析器显示有超过1700个生存代,但堆大小保持不变。通过阅读文献this article,我发现可以使用NetBeans分析器来发现泄漏问题。
因此,按照文章的建议,我启动了内存分析器。在查看结果时,我发现char[]占据了大部分生存代。截至目前,char[]已经达到了22代并继续增长。
现在有些posts (comment by OldCurmudgeon near the bottom)表明,如果我的堆稳定,则不存在泄漏yet others,则表示如果代继续增长,则存在泄漏。因此,我有点困惑哪一个是正确的。
所以,我的问题是: 根据以下屏幕截图,我应该进一步调查潜在的内存泄漏吗? Memory(Heap) 内存(堆)
Memory(GC) 内存(垃圾回收)
Live allocated objects 已分配的活动对象
3个回答

8
char[] 很可能由 String 对象持有。它们可以在任何地方为任何目的创建,例如分析器和 JMX 使用它们,因此一个什么也不做的进程将显示这些内容(以及不断增长的堆)。
注意:所有字符串字面值和类名称等名称都会存活到 ClassLoader 卸载(这可能是程序的生命周期)。
要确定堆使用情况是否增长,您应该查看完整 GC 后保留的量。在每个低谷的底部看起来对我来说都是一样的。其他信息对性能调优有用,但本身并不是问题。

有趣,你有什么推荐的资源可以了解性能分析吗? - Robert H
2
我不能说我遇到过任何问题。我建议获取商业分析工具YourKit的评估版本,以查看它所产生的差异。例如,它不使用堆来执行其工作,因此不会在堆上创建“噪音”。 - Peter Lawrey
2
我建议对于你理解其所有操作的简单程序进行性能分析,以查看CPU和内存分析的情况。这可以帮助你了解复杂应用程序正在执行的操作(并知道要忽略哪些操作,其中有相当多的)。 - Peter Lawrey
谢谢,我会采纳那个建议。 - Robert H
问题的一部分是性能分析器应该做什么以及当您对应用程序进行性能分析时实际发生了什么,例如它会改变程序的行为方式,使其变慢,并且无法测量小时间间隔。 - Peter Lawrey

2

在我的性能分析中,我也遇到了这些持续存在的char[]。经过长时间的分析,我得出结论,其中许多是String常量池中的char数组。


2
不查看代码,无法判断。有些程序使用TB的内存,它们之所以能够良好运行,并不是因为存在内存泄漏,而只是这个程序工作的方式。 Netbeans文档仅定义了生存代是什么,并没有告诉我们如何使用该数字来发现内存泄漏。此外,char[]只是String的内容,它可以被保留很长时间(甚至与主线程一样长)。
没有神奇的方法来找到泄漏。您应该在可行的负载下运行程序,并查看内存使用情况是否与预期模式一致。如果不是,则存在问题,但在没有任何上下文的情况下,那个图形并没有意义。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接