gpt4 book ai didi

java - Android FinalizerDaemon 挂了

转载 作者:IT老高 更新时间:2023-10-28 21:02:52 24 4
gpt4 key购买 nike

我在 Android 应用中遇到了一个非常奇怪的问题。在某个点之后(大约在主要 Activity 开始并显示 fragment 时),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)

然而队列不是空的。如果我在使用应用程序一段时间后转储堆,则队列实际上有数千个条目。数据结构看起来也没有损坏: FinalizerDaemon instance showing a non-empty ReferenceQueue

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

现在,我注意到了这一点,因为我保留了一些 C++ 对象,这些对象需要在某个时候释放。虽然我怀疑终结器调用 JNI 函数并在 C++ 端做一些愚蠢的事情可能会以某种方式破坏它,但我所有的日志都表明所有终结器都运行良好并且没有抛出任何东西就返回,直到它们随机停止被调用。此外,finalize 调用实际上不可能破坏守护进程,除非对整个应用程序造成段错误或其他什么,因为 Watchdog 应该处理运行时间过长并引发异常的终结器。

我尝试了一个显式的 System.runFinalization(),它所做的只是永远挂起主线程,等待永远不会运行的守护进程。

知道这是怎么发生的吗?

最佳答案

我相信这与某些对象有关 resurrected在他们的 finalize 方法中。

我将引用此 question 中的一段话.

The finalizer thread runs so the garbage collection operates to clean up resources associated with an object. If I'm seeing it corectly, the finalizer can't get the lock to this object: java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118) because the java object is running a method, so the finalizer thread is locked until that object is finished with it's current task.

也许你的情况就是这样。

关于java - Android FinalizerDaemon 挂了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37001181/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com