我实现了一些ExternalStrctures(作为“FFI工作”的一部分),对于其中一些我想实现最终化以回收外部存储器。
我正在尝试为此编写一些测试,似乎无论多少次我使用Smalltalk garbageCollect
强制执行垃圾收集,最终确定(显然)从未触发过。
为了确保我在从终结器调用的函数中放置了一个外部断点(使用gdb),但是断点永远不会被击中。 我还检查了对象的所有引用(在运行许多GC之后),唯一的引用是WeakRegistry(我使用allInstances获取了对象)。
有没有办法强制终结(在Cuis / Pharo / Squeak中)?
答案 0 :(得分:3)
Smalltalk garbageCollect
应始终触发终结。如果对象是新的,那么Smalltalk garbageCollectMost
也可能触发它(取决于VM)。
请注意,最终化是由图像中的进程实现的。如果由于某种原因该进程未运行,则不会进行最终确定。
此外,VM历史上有不同的方式来向图像发信号通知最终确定哪些对象。最初,最终确定过程必须扫描所有弱对象,这些对象虽然健壮但效率低下。现在,VM和图像必须就找到要完成的对象的方法达成一致。如果这些不匹配,最终确定可能不可靠。
答案 1 :(得分:0)
我认为OpenCL.pck.st包中的#testFinalization可能会有所帮助,至少作为一个开始的工作实验。