繁体   English   中英

参考不足和内存泄漏

[英]WeakReference and memory leaks

我使用VisualVM对应用程序进行性能分析,发现堆大小在大约3天内增加了约7MB。 当我使用内存采样器时,我还看到java.lang.ref.WeakReference在实例编号的前五位中。 WeakReference的数量在增加,GC几乎没有效果。

任何想法?

您没有内存泄漏。

Java的GC仅在堆满时运行(实际上,由于将堆本身分成几代,但实际上要复杂一些,但还是要复杂一些),因此除非您填充堆(这很不可能,因为7Mb对于任何堆来说太少的内存)您无法分辨是否存在泄漏。

WeakReferences是小型包装程序,通过将它们引用的对象标记为GC可识别的对象,实际上有助于防止内存泄漏。 我的猜测是,您将包括某种可以创建大量此类的缓存库,并且由于堆仍具有足够的空间,因此无需进行垃圾回收。

同样,除非您看到GC经常运行并且您的堆大小仍然增加,否则我不会担心内存问题。

这是一篇很棒的文章

万一JVM运行完整的GC,WeakReferences是第一个被收集的,但是,它们不能强/弱地到达(强/软引用必须不包含对它的引用)。 我通常最不担心WeakReferences,它们最终还是由GC编写的。 您应该检查您的GC周期(jstat),看看是否连GC也没有要求这些参考。 另外,请不要推断泄漏,您的应用程序在未来几天可能不一定会增加其内存消耗。 我建议在非生产环境中进行长时间(48小时)的性能测试,并施加大量负载,并查看是否遇到内存问题。

VisualVM使用系统中的资源。 与商业分析器相比,这是其缺点之一。 因此,VisualVM无法轻易看到微小的差异,因为它会产生自己的噪音。

假设您在3天内泄漏了7 MB(我对此表示怀疑)。 您花多少时间修理它? 16 GB的内存成本约为100美元,因此7 MB的成本约为5美分,或大约3秒钟的时间。 如果它更大,更大,我会更担心。

暂无
暂无

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

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