1

我開發了一些應用程序,它從客戶端獲取數據併爲其創建新的nsGC在Clojure中刪除ns後刪除所有對象嗎?

應用之後做一些操縱ns,調用函數等

最後應用返回一些輸出,並刪除了ns事後(remove-ns)

GC是否刪除該NS的所有數據(對象)?

另一個問題是:是要明智地爲每個客戶端NS? 我需要將客戶端彼此隔離,以免發生衝突。 (併發用戶)

+0

附加一個分析器爲自己測試一下:) – pkk

+0

除非您保留對名稱空間中引用的名稱或值的引用,否則它們將被垃圾收集。現在,你真的需要每個客戶端有一個名稱空間嗎?我不知道。你是否爲每個客戶創建新的符號? – coredump

+0

@coredump是的,想像它是新的會議新環境 –

回答

6

不幸的是,你的問題並不簡單是或否。

remove-ns[1]確實這是什麼調用clojure.lang.Namespace[2]靜態remove方法,它事務將取消該符號命名從NS名字命名空間物體在全局映射的命名空間。這使得不可能對名稱空間進行新的引用,因爲命名空間和完全限定的符號/變量是通過命名空間映射來解析的,但它不會銷燬命名空間或其內容。

如果存在未映射的命名空間或其內容的引用,那麼是的,它會(最終)被垃圾收集。但是,這假定該名稱空間中的所有變量都不會轉義。從這些臨時命名空間中的一個,如果你曾經需要/指瓦爾爲長住,要創建的兩個命名空間,這將導致「臨時」的命名空間從來沒有被刪除,除非它也是ns-unmap PED [3]的永久鏈路。

現代JVM使用跟蹤垃圾收集器,所以對象將只被垃圾收集,如果有足夠的內存壓力,迫使GC運行,並有其本身並不是垃圾對象的殘留使用。因此,舉例來說,如果你被編譯在自己的沙箱的名稱空間每個會話的功能,返回該功能,調用它,然後把它扔了,並去映射臨時命名空間會可能工作OK,因爲只有明確提及臨時namespace是返回的閉包(將被丟棄)以及您刪除的全局名稱空間映射。但確切的行爲完全取決於應用程序的結構。

在架構層面,它是安全的,說你這樣做是錯誤的。在Clojure編譯(eval)很慢。你真的不應該動態生成函數,更不用說運行時的命名空間。通過這樣做,您就爲自己創建了這個架構問題,因爲您正在使用旨在成爲全局綁定結構(命名空間和變量)的內容來存放臨時綁定,然後您必須擔心清理問題。

如果您確實需要動態綁定或堆棧局部變量,則有用於創建這種短暫上下文的結構。否則,您可能會通過重構它來更大程度地簡化您的應用程序,以更廣泛地使用部分應用程序和參數化上下文,這些應用程序和參數上下文可能屬於更常見的數據使用模式,並且會正常進行垃圾收集。

2

我認爲,你在你的命名空間做(remove-ns),所以如果你用Clojure源代碼看clojure.core,它的命名空間符號調用Namespace.remove,反過來會從併發HashMap中刪除。如果符號僅與命名空間綁定,則應該用gc清理它們。

查看您正在使用的版本的clojure代碼是否確定,以及ofc是否最好懷疑是否通過附加探查器來查看這些對象實際上是否在刪除後這個函數調用。