Android FinalizerDaemon挂断会怎样?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (22)

我在Android应用程序中遇到了一个非常奇怪的问题。在某一点之后(主要活动开始并显示一个片段时),FinalizerDaemon只是停止处理对象,并且垃圾不断堆积。看着一个线程转储,它似乎被卡住了ReferenceQueue.remove()

"FinalizerDaemon@4461" daemon prio=5 waiting
  java.lang.Thread.State: WAITING
      at java.lang.Object.wait(Object.java:-1)
      at java.lang.Object.wait(Object.java:423)
      at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:101)
      - locked <0x1173> (a java.lang.ref.ReferenceQueue)
      at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:72)
      at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:185)
      at java.lang.Thread.run(Thread.java:818)

然而队列并不是空的。如果我在使用应用程序一段时间后转储堆,那么队列的字面长度将是数千条。数据结构也看起来没有问题:

在分配和再次收集垃圾之后再次转储显示队列的头部与之前是相同的Matrix实例。

提问于
用户回答回答于

我相信这与一些对象在最终确定方法中复活有关。

我会引用这与的一段话:

终结器线程运行以便垃圾收集操作清理与对象关联的资源。如果我正确地看到它,终结器无法获得对该对象的锁定:java.lang.ref.ReferenceQueue.remove(ReferenceQueue。java:118),因为 java对象正在运行一个方法,所以终结器线程是直到该对象完成当前任务。

扫码关注云+社区