在Clojure中删除ns后,GC是否删除了所有对象?

Ert*_*tin 1 lisp garbage-collection functional-programming clojure clojurescript

我开发了一些应用程序,它从客户端获取数据并ns为其创建新数据.

应用程序执行一些操作后ns,调用函数等.

最后app返回一些输出,ns之后我删除了(remove-ns)

GC是否删除了该ns中的所有数据(对象)?

另一个问题是:为每个客户创建ns是明智的吗?我需要将客户端彼此隔离,这样就不会发生冲突.(并发用户)

arr*_*dem 6

不幸的是,你的问题没有简单的是或否答案.

什么remove-ns[1]所做的就是调用静态remove的方法clojure.lang.Namespace[2] ,该事务将取消该符号命名从NS名字命名空间物体在全局映射的命名空间.这使得无法对命名空间进行新的引用,因为命名空间和完全限定的符号/变量是通过命名空间映射解析的,但它不会破坏命名空间或其内容.

如果没有对未映射的命名空间或其内容的引用,那么它(最终)将被垃圾收集.但是,这假设该命名空间中的所有Vars永远不会逃脱.如果你曾经要求/从这些临时命名空间之一引用Vars到很长时间,你就会在两个命名空间之间创建一个永久链接,这将导致"临时"命名空间永远不会被删除,除非它也是ns-unmapped [3].

现代JVM使用跟踪垃圾收集器,因此如果有足够的内存压力来强制GC运行,对象将只被垃圾收集,并且没有剩余的对象本身就是垃圾.因此,例如,如果您在其自己的沙箱命名空间中编译每个会话的函数,则返回该函数,调用它然后将其丢弃并取消映射可能正常工作的临时命名空间,因为对临时命名空间的唯一显式引用是返回的闭包(被丢弃)和您删除的全局命名空间映射.但确切的行为完全取决于您的应用程序的结构.

在建筑层面,可以肯定地说你做错了.Clojure(eval)中的编译很慢.你真的不应该在运行时动态生成函数,更不用说命名空间了.通过这样做,您正在为自己创建这个体系结构问题,因为您(ab)使用了旨在成为全局绑定结构(Namespaces和Vars)的东西来保存临时绑定,然后您必须担心清理.

如果您确实需要动态绑定或堆栈本地Vars,则可以使用用于创建此类短期上下文的结构.否则,您可能会通过重构来大大简化应用程序,以便更广泛地使用部分应用程序和参数上下文,这些应用程序和参数上下文属于更常规的数据使用模式,并且会正常进行垃圾收集.