可能通过 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】:有关您的问题的更多详细信息,请查看您的Finalizer
的referent 字段。
终结器对象只是扩展了Reference
s,因此您可以调查内容。它将为您提供有关最终确定对象的信息。
根据内容,您将获得新的潜在客户。待处理对象的最终确定过程可能非常长。由于您只有一个线程处理所有这些,因此您可能会以某种方式完成更多工作。
干杯
【讨论】:
【参考方案2】:您的应用中可能没有涉及 FinalizerReference 的内存泄漏,尽管 Android Memory Profiler 看起来确实存在。
我的investigation 类似的顾虑让我确信 Profiler 在 FinalizerReference 的情况下对相同的少量内存执行大量多次计数,因此 Retained Memory 的报告值是没有意义的,有时甚至是ludicrous。
在您的情况下,~38kB Shallow Size 很重要,但很小,而 ~40 MB Retained Memory 应该被忽略。
【讨论】:
以上是关于可能通过 FinalizerReference 泄漏内存的主要内容,如果未能解决你的问题,请参考以下文章