我正在使用源代码Surface.java作为此问题的参考.
Surface实现了Parcelable接口,它还保存了本机端对象的句柄.
我很想知道在这种情况下如何处理垃圾收集:
创建曲面(A)并将其写入包裹.之后没有提到它.
从包裹中读取原始表面(B)的副本; 让我们说这发生在另一个用于渲染的线程上.此实例现在保持与(A)相同的本机句柄,并且在某处对此实例有强引用.
发生GC并收集(A),因为它不再被引用.finalize()运行,调用release(),然后调用nativeRelease(long)本机句柄.
粗略地看一下源代码让我觉得现在(B)也应该踢掉桶并停止工作,因为本机句柄被释放了,但是在尝试复制之后似乎并非如此.(A)确实被收集但(B)继续存在并仍然可用.
现在我感觉有一些引用计数继续使用本机对象,或者在parcelling进程的本机端进行其他一些魔术.
无论我的假设是否正确,我都在寻找导致此行为的原因的概述,最好是对框架源代码的一些引用.我也对表面锁定在类似情况下的工作方式感兴趣.
java java-native-interface android garbage-collection parcelable