3

eval を使用する遺伝的プログラミング アルゴリズムを実行すると、この問題が発生します。

問題を説明するために、次のコード フラグメントに絞り込みました。

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

コードを実行すると、ガベージ コレクターは作成されたすべての $eval_n クラスを一度メタスペースからアンロードしますが、2 回目のガベージ コレクター呼び出しでハングします。

jdk1.8.0_102 を次の JVM オプションとともに使用します: -XX:MetaspaceSize=200m -XX:MaxMetaspaceSize=200m

しばらくすると、次のエラーが表示されます。

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

編集: VisualVM のスクリーンショットを追加して動作を示しました。JVM がハングすると、グラフは更新されなくなり、フル CPU コアを使用し続けます。

ここに画像の説明を入力

また、Java 7 (JMV オプションなし) を使用して試してみましたが、PermGen で同じ問題が発生しました。

この問題を回避する方法はありますか?

編集:

この問題は、eclipse-counterclockwise を使用して leinigen-REPL から実行した場合にのみ発生します。基本的なコマンド ライン REPL からコードを実行すると、問題は発生しません。

4

2 に答える 2

0

この問題は、clojure eval や JVM とは直接関係がないと結論付けました。これは、eclipse-counterclockwise および/または leiningen-REPL との組み合わせでのみ発生します。

于 2016-09-17T14:20:04.713 に答える
0

上記の例では、メモリ消費量が着実に増加していることに気付きました。システム/gc の追加

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

CPU 消費量は 2 倍になりましたが、メモリ使用量は長期的に安定した状態に保たれました。

于 2016-09-16T23:50:19.677 に答える