【发布时间】:2017-01-03 16:14:56
【问题描述】:
我已经实现了一些 ExternalStrctures(作为“FFI 工作”的一部分),对于其中一些我想实现最终化以回收外部内存。
我正在尝试为此编写一些测试,似乎无论我用Smalltalk garbageCollect 强制进行垃圾回收多少次,最终确定(显然)都不会触发。
为了确保我在从终结器调用的函数中放置了一个外部断点(使用 gdb),但断点从未被命中。 我还检查了对该对象的所有引用(在运行了许多 GC 之后),唯一的引用是 WeakRegistry(我使用 allInstances 获得了该对象)。
有没有办法强制完成(在 Cuis/Pharo/Squeak 中)?
【问题讨论】:
-
你见过对象吗>>#toFinalizeSend:to:with:?
-
我做到了,谢谢。我的理解是
#toFinalizeSend:to:with将替换原来的终结行为,但不会强制终结。我可以用它来知道触发了终结,但不能强制终结。我相信如果我将最终确定转发到原始方法,那么解决我的其他问题可能会很有趣。不错:-) -
我发现我在进行最终确定的过程中遇到了问题。由于某种原因,它不会自动启动(如果我保存图像,它也会被禁用)。现在要重新启动它,我正在手动执行
WeakArray restartFinalizationProcess,之后,Smalltalk garbageCollect会强制完成。一旦我了解如何正确安装进程,我会回答这个问题。 -
在 Squeak 中,
restartFinalizationProcess在映像启动时发送(请参阅WeakArray initialize)。我怀疑您在某个时候在终结器中出现错误,并且您关闭了调试器,这将终止终结过程。终结器被认为是没有错误的;) -
我刚刚发现
WeakArray finalization的进程在图像保存后没有返回。这是 Cuis 特有的,它可能存在也可能不存在于其他 Squeak 口味中。我会试着找出原因,