Clojure インタープリターが含まれている「lein uberjar」を介して構築された、Clojure で BaseX 用のプラグインを作成しています。ほとんどの場合、これでうまくいきます。
ただし、BaseX HTTP インスタンスを介して実行する場合、クライアントが切断された後にスレッドが破棄されるのではなく、Jetty のスレッド プール内で評価が行われます。
プラグインをロードすると、カスタム クラスローダーを介して Clojure のクラスがロードされ、プラグインのエントリ ポイントとして機能する (AOT コンパイル済み) オブジェクト インスタンスを破棄しても、Clojure によってスレッド ローカル空間に配置された変数は破棄されないため、PermGen でクラスローダー リークが発生します。 Clojure インタープリターの複数のインスタンスによって最終的にスペースが使い果たされます。
これはどのように解決できますか?必要に応じて、BaseX のモジュールのロード/アンロード メカニズムに適切な非 Clojure 固有の変更を加えることができます。