Pharo Smalltalk - 有没有办法在 Seaside 开发期间对对象(实例)(过期会话等)强制解除分配(dealloc)?

Pharo Smalltalk - Is there a way to force deallocation (dealloc) on an Object (instance) (expire sessions etc) during Seaside development?

当你想对某个实例进行垃圾回收时,你可以向它发送什么消息?

我正在开发一个基于 Seaside 的应用程序,很多事情都可能失控,包括我的 RootComponent 有 10 个实例(这正常吗),我想要一个新的开始(不是新图像)

稍后编辑:阅读了一下,显然这个问题是自动垃圾收集世界的诅咒,所以让我改一下。

无法让 VM 对特定对象进行垃圾回收。您可以评估 Smalltalk garbageCollect. 以强制进行垃圾回收,但这只会触发 VM 对所有对象的垃圾回收机制。

这里通常有两个问题(根据我的经验):

  1. Pharo VM 中的垃圾收集在两个不同的阶段使用两种不同的算法(我相信它们是“标记和清除”和“清除”)。因此,单个 Smalltalk garbageCollect. 可能不足以实际删除该对象。你会经常看到像 3 timesRepeat: [ Smalltalk garbageCollect ]. 这样的代码,它试图确保一个对象被收集。另请注意,一些特殊对象不受垃圾收集的保护(如 niltruefalse 等)。
  2. 在某些情况下,垃圾收集算法似乎无法解决所有过时的对象。我已经看到这种情况发生在 Morphic 事件机制中。在那里,事件只是方法上下文中的闭包。即使已注册的对象已被垃圾回收,一些事件仍会存在(如果负责的对象没有正确注销它们),创建无法回收的整个对象图(因为无法回收根)。我怀疑实际问题是某种循环依赖。请注意,这是一个例外情况,强制垃圾收集通常效果很好。

话虽如此,我们使用 Seaside 已经将近十年了,垃圾回收通常是我们最不关心的问题之一。当我们需要垃圾收集/清理的东西时,将变量置零并强制垃圾收集(3 次)就可以了。

编辑

在 Seaside 2.8 中你可以评估 WARegistry clearAllHandlers.,在 Seaside 3 中大致相当于 WAAdmin clearAll.。这些语句将清除活动和过期的会话,并丢弃您可能关心的大部分内容。 注意:#clearAll 也将清除配置和注册的入口点。如果您只想重置会话,请使用 #clearSessions。如果您需要更彻底的清理,请使用 #clearAll

编辑 2

使用myObject pointersTo. 查找指向特定对象的所有指针。您也可以右键单击 GTInspector 中的条目,然后单击“打开指向的指针”。

您可能还想查看 PointerDetective,它试图以图形方式表示指针查找过程。