如何在 Cuis/Squeak/Pharo 中强制完成(用于测试)?

How to force finalization (for testing) in Cuis/Squeak/Pharo?

我已经实现了一些 ExternalStrctures(作为 "FFI effort" 的一部分),对于其中一些我想实现最终确定以回收外部内存。

我正在尝试为此编写一些测试,似乎无论我用 Smalltalk garbageCollect 强制垃圾收集多少次,最终都(显然)从未触发。

为了确保这一点,我在从终结器调用的函数中放置了一个外部断点(使用 gdb),但从未命中断点。 我还检查了对该对象的所有引用(在 运行 多次 GC 之后),唯一的引用是 WeakRegistry(我使用 allInstances 访问了该对象)。

有没有办法强制完成(在 Cuis/Pharo/Squeak 中)?

我认为 OpenCL.pck.st 包中的 #testFinalization 可能会有帮助,至少作为一个工作实验开始。

Smalltalk garbageCollect 应始终触发最终确定。如果对象是新的,那么 Smalltalk garbageCollectMost 也可能会触发它(取决于 VM)。

请注意,终结是由图像中的进程实现的。如果由于某种原因该过程不是 运行,则不会发生最终确定。

此外,历史上有不同的方式让 VM 向图像发出要完成的对象的信号。最初,终结过程必须扫描所有弱对象,这很健壮,但效率低下。如今,VM 和映像必须就找到要完成的对象的方法达成一致。如果这些不匹配,最终确定可能不可靠。