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是否最好怀疑是否通过附加探查器来查看这些对象实际上是否在删除后这个函数调用。