3

Clojure インタープリターが含まれている「lein uberjar」を介して構築された、Clojure で BaseX 用のプラグインを作成しています。ほとんどの場合、これでうまくいきます。

ただし、BaseX HTTP インスタンスを介して実行する場合、クライアントが切断された後にスレッドが破棄されるのではなく、Jetty のスレッド プール内で評価が行われます。

プラグインをロードすると、カスタム クラスローダーを介して Clojure のクラスがロードされ、プラグインのエントリ ポイントとして機能する (AOT コンパイル済み) オブジェクト インスタンスを破棄しても、Clojure によってスレッド ローカル空間に配置された変数は破棄されないため、PermGen でクラスローダー リークが発生します。 Clojure インタープリターの複数のインスタンスによって最終的にスペースが使い果たされます。

これはどのように解決できますか?必要に応じて、BaseX のモジュールのロード/アンロード メカニズムに適切な非 Clojure 固有の変更を加えることができます。

4

1 に答える 1

1

このアイデアはうまくいくかもしれません(またはうまくいかないかもしれません):

  1. uberjarを作成せず、Clojurejarを分離してください。

  2. Clojure jarをBaseXのメインクラスパスに配置してクラスローダー階層を上にプッシュします(BasexXサーバーを起動するコマンドラインを編集しますjava -cp BaseX.jar;clojure.jar org.basex.BaseXServer)。

  3. プラグインをコードだけを含むjarとしてパッケージ化し、メインクラスパスにすでに存在するClojureクラスに依存します。

于 2012-04-10T20:50:09.830 に答える