有没有办法摆脱加载的 clojure 类?

is there a way to get rid of loaded clojure classes?

当 运行 时,下面创建了一堆 类 被加载

(dotimes [i 1000000]
  (eval `(fn [] (+ ~i 10))))

可以通过连接到 visualvm 来检查对象:

在某些时候,vm 决定卸载对象,但它相当随意。有没有办法在加载 100k 而不是 500k 时卸载这些对象?

想想你为什么要摆脱它们。只是躺在那里,他们除了消耗内存什么都不做,所以我想你想减少你的内存占用。所以,告诉 JVM。我不是 JVM 标志或性能方面的专家,但我的理解是,在现代 JVM 中,加载的 类 以类似于普通对象的方式进行 GC,但存储在一个名为 MetaSpace 的单独区域中。如果您知道您的程序永远不需要一次加载很多 类,您可以通过设置 JVM 选项 -XX:MaxMetaspaceSize.

来限制 space

根据@amalloy 的建议。设置 -XX:MaxMetaspaceSize=256m 会产生这个(这是必需的效果)