可能通过 FinalizerReference 泄漏内存

Posted

技术标签:

【中文标题】可能通过 FinalizerReference 泄漏内存【英文标题】:Possible Memory leak through FinalizerReference 【发布时间】:2016-02-13 11:29:16 【问题描述】:

我有一个小的 android 应用程序,我尝试查找内存泄漏,所以我单击了“Dump Java Heap”,列表中的第一个类是 FinalizerReference (java.lang.ref)。它有超过 500 个实例,每个实例都有一个“下一个”和“上一个”到另一个 FinalizerReference。

我知道 FinalizerReference 来自实现 Object.finalize() 的对象,但我的应用程序中没有实现它的对象。我怎样才能找出为什么会发生这种泄漏并修复它?

【问题讨论】:

您是否遇到了 OutOfMemoryErrors,或者您只是怀疑可能由于 FinalizerReference 实例而导致内存泄漏? @1615903 只是怀疑.. @EJP 这是一种奇怪的方法。不要测试您的应用程序是否存在潜在的内存泄漏。 @amitooshacham 你发现问题了吗?我正面临着确切的问题! is memory leak? why java.lang.ref.Finalizer eat so much memory的可能重复 【参考方案1】:

有关您的问题的更多详细信息,请查看您的Finalizerreferent 字段。 终结器对象只是扩展了References,因此您可以调查内容。它将为您提供有关最终确定对象的信息。

根据内容,您将获得新的潜在客户。待处理对象的最终确定过程可能非常长。由于您只有一个线程处理所有这些,因此您可能会以某种方式完成更多工作。

干杯

【讨论】:

【参考方案2】:

您的应用中可能没有涉及 FinalizerReference 的内存泄漏,尽管 Android Memory Profiler 看起来确实存在。

我的investigation 类似的顾虑让我确信 Profiler 在 FinalizerReference 的情况下对相同的少量内存执行大量多次计数,因此 Retained Memory 的报告值是没有意义的,有时甚至是ludicrous。

在您的情况下,~38kB Shallow Size 很重要,但很小,而 ~40 MB Retained Memory 应该被忽略。

【讨论】:

以上是关于可能通过 FinalizerReference 泄漏内存的主要内容,如果未能解决你的问题,请参考以下文章

美团外卖服务端的测试面试题居然泄……泄……泄……泄密了

3倍镜和6倍镜来了!《绝地求生》数据挖掘泄机密!

Node.js 流 API 泄​​漏

java 线程泄之一

挖掘机密封件常见泄压分类状况及解决措施

锅炉防磨防爆可视化管理系统