繁体   English   中英

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

[英]Why is char[] surviving so many generations, and should I be concerned?

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

因此,在关注文章建议后,我开始了一个内存分析器。 在查看结果时,我发现char []占了大多数幸存的世代。 目前,在这篇文章中,char []已经22代了。

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

所以,我的问题是:

根据以下屏幕截图,我应该进一步研究潜在的内存泄漏吗?

内存(堆) 内存(堆)

存储器(GC) 存储器(GC)

实时分配的对象 实时分配的对象

char[]可能由String对象保存。 它们可以出于任何目的在任何地方创建,例如探查器和JMX使用它们,因此一个什么都不做的过程将显示这些(以及不断增长的堆)

注意:所有字符串文字和类等的名称将一直存在,直到卸载ClassLoader(这可以是程序的生命周期)

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

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

没有看代码,人们无法分辨。 有些程序使用TB的内存,它们运行良好,因为它不是内存泄漏,它只是程序的工作方式。

Netbeans文档只定义了幸存的代数 ,而不是如何使用该数字来发现内存泄漏。 而且, char[]只是String的内容,它可以保留很长时间(甚至只要主线程)。

找到泄漏没有灵丹妙药。 您应该在可行的负载下运行程序,并查看内存使用情况是否与预期模式一致。 如果不是,那么你有一个问题,但没有任何上下文,图表没有任何意义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM