如何在 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 和映像必须就找到要完成的对象的方法达成一致。如果这些不匹配,最终确定可能不可靠。
我已经实现了一些 ExternalStrctures(作为 "FFI effort" 的一部分),对于其中一些我想实现最终确定以回收外部内存。
我正在尝试为此编写一些测试,似乎无论我用 Smalltalk garbageCollect
强制垃圾收集多少次,最终都(显然)从未触发。
为了确保这一点,我在从终结器调用的函数中放置了一个外部断点(使用 gdb),但从未命中断点。 我还检查了对该对象的所有引用(在 运行 多次 GC 之后),唯一的引用是 WeakRegistry(我使用 allInstances 访问了该对象)。
有没有办法强制完成(在 Cuis/Pharo/Squeak 中)?
我认为 OpenCL.pck.st 包中的 #testFinalization 可能会有帮助,至少作为一个工作实验开始。
Smalltalk garbageCollect
应始终触发最终确定。如果对象是新的,那么 Smalltalk garbageCollectMost
也可能会触发它(取决于 VM)。
请注意,终结是由图像中的进程实现的。如果由于某种原因该过程不是 运行,则不会发生最终确定。
此外,历史上有不同的方式让 VM 向图像发出要完成的对象的信号。最初,终结过程必须扫描所有弱对象,这很健壮,但效率低下。如今,VM 和映像必须就找到要完成的对象的方法达成一致。如果这些不匹配,最终确定可能不可靠。