gpt4 book ai didi

Clojure eval 导致垃圾收集器挂起

转载 作者:行者123 更新时间:2023-12-02 04:07:08 25 4
gpt4 key购买 nike

我在运行使用 eval 的遗传编程算法时遇到了这个问题。

为了说明问题,我将其范围缩小到以下代码片段:

(loop []
(do
(eval (list '+ (rand) (rand)))
(recur)))

当我运行代码时,垃圾收集器会从元空间卸载所有创建的 $eval_n 类一次,但在第二次垃圾收集器调用时它会挂起。

我使用 jdk1.8.0_102 和以下 JVM 选项:-XX:元空间大小=200m-XX:MaxMetaspaceSize=200m

过了一会儿,我收到以下错误:

CompilerException java.lang.OutOfMemoryError: Metaspace, compiling:(form-init2581690491924993906.clj:1:1) 

编辑:我添加了 VisualVM 的屏幕截图来显示行为,当 JVM 挂起时,图表不再更新,并且它继续使用完整的 CPU 核心。

enter image description here

我也尝试过使用java 7(没有任何JMV选项),并且在PermGen中遇到了同样的问题。

有什么办法可以避免这个问题吗?

编辑:

仅当我从 leinigen-REPL 中使用 eclipse-逆时针运行它时,才会出现此问题。如果我从基本命令行 REPL 运行代码,则不会出现问题!

最佳答案

我注意到上面的例子中内存消耗稳步增加。添加系统/gc

(loop [] (do (eval (list '+ (rand) (rand))) (System/gc)) (recur))

CPU 消耗增加了一倍,但内存使用量保持在看起来长期稳定的状态。

关于Clojure eval 导致垃圾收集器挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39539998/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com