簡體   English   中英

從 JVM 線程局部空間卸載 Clojure 變量

[英]Unloading Clojure vars from JVM thread-local space

我正在為 Clojure 中的 BaseX 編寫一個插件,它是通過“lein uberjar”構建的,其中包含 Clojure 解釋器。 在大多數情況下,這很有效。

然而——當通過 BaseX HTTP 實例運行時,評估發生在 Jetty 的線程池中,而不是在客戶端斷開連接后丟棄線程。

當加載插件通過自定義類加載器加載 Clojure 的類時,丟棄作為插件入口點的(AOT 編譯的)object 實例不會丟棄 Clojure 在線程本地空間中放置的變量,PermGen 會導致類加載器泄漏空間最終被 Clojure 解釋器的多個實例耗盡。

如何解決? 如有必要,我可以對 BaseX 的模塊加載/卸載機制進行合理的非 Clojure 特定更改。

這個想法可能(或可能不)有效:

  1. 不要做uberjar,把Clojure jars分開;

  2. 通過將 Clojure jars 放入 BaseX 的主類路徑(編輯啟動 BasexX 服務器的命令行,類似於java -cp BaseX.jar;clojure.jar org.basex.BaseXServer ),向上推類加載器層次結構;

  3. Package 你的插件是一個 jar ,里面只有你的代碼,並且依賴於主類路徑中已經存在的 Clojure 類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM