簡體   English   中英

Pharo Smalltalk-在Seaside開發期間,是否有一種方法可以在對象(實例)(到期會話等)上強制重新分配(取消分配)?

[英]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 ].代碼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 ,它試圖以圖形方式表示指針查找過程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM