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 からコードを実行すると、問題は発生しません。