【问题标题】:How to force finalization (for testing) in Cuis/Squeak/Pharo?如何在 Cuis/Squeak/Pharo 中强制完成(用于测试)?
【发布时间】: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 口味中。我会试着找出原因,

标签: smalltalk pharo squeak


【解决方案1】:

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

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

此外,在历史上,VM 有多种不同的方式来向图像发出信号以告知要完成哪些对象。最初,最终确定过程必须扫描所有弱对象,这很强大,但效率低下。现在,VM 和映像必须就找到要完成的对象的方法达成一致。如果这些不匹配,最终确定可能不可靠。

【讨论】:

  • 谢谢伯特!有确定性是非常好的。我发现你说的,终结过程没有运行,也没有自动启动。我必须手动运行 `WeakArray restartFinalizationProcess` 来开始完成,我的测试工作。
【解决方案2】:

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

【讨论】:

  • 您能在此处粘贴一些代码吗?这样会更方便。
  • 好吧,测试断言完成的效果发生在执行“Smalltlak garbegeCollectMost”之后。在此处粘贴代码需要有关 OpenCL 包设计的相当多的细节,这与问题无关。我的原始答案根本没有回答这个问题,它只是建议在哪里看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-09
相关资源
最近更新 更多