簡體   English   中英

Domino JVM 內存和 POI

[英]Domino JVM memory and POI

我有一個代理,它使用 Apache POI 將筆記文檔導出到 excel (xlsm)。 我正在通過使用 recycle() 或將對象設置為 null 來遵循各種可能的方法來釋放內存。但是,JVM 仍然超出堆大小並拋出“內存不足”錯誤。 這里有更多信息,

  • 默認堆大小=256MB
  • POI 版本 - 3.17
  • 錯誤發生的頻率如何? 如果我從網絡上連續運行代理 5-6 次。
  • xlsm 模板大小:90 kb
  • 寫入記錄數 - 10-30

我正在觀察但無法理解的另一件事是 JVM 如何使用/釋放內存。 例如,我在代碼開始之前和代碼結束之后使用以下代碼打印“可用”內存,

Runtime runtime = Runtime.getRuntime();
double usedMemory = usedMemory(runtime);

System.out.println("START - Initial memory :: " + String.valueOf(usedMemory) )

static double usedMemory(Runtime runtime) {
        long totalMemory = runtime.totalMemory();
        long freeMemory = runtime.freeMemory();
        double usedMemory = (double)(totalMemory - freeMemory) / (double)(1024 * 1024);
        return usedMemory;
    }

當我第一次測試我的代理時,它的打印結果是,

JVM 開始:可用初始內存:60 MB

JVM 結束:已用內存:90 MB

第二次代理啟動時打印,

JVM 開始:可用初始內存:130 MB

JVM 結束:已用內存:160 MB

即使我在代碼末尾釋放內存,我也看到它沒有降到初始內存(60 MB)?

        /* Free up memory */
        webDoc.recycle();
        docA.recycle();
        vwLookup.recycle();
        curDb.recycle(); 
        session.recycle(); 

        agentContext=null;

        fpath.delete();
        xlFile.delete();

        runtime = Runtime.getRuntime();
        usedMemory = usedMemory(runtime);

        System.out.println("END - MAIN :: Total used memory: " + String.valueOf(usedMemory) );

        freeMemory();

我去年就這個問題開設了一個 PMR。 IBM 的回答如下:

我想通知您,這是一個已知的限制,將 jar 文件附加到代理或腳本庫。 請參閱以下報告該問題的一些 SPR:

SPR # BHUY8VML6R:“僅當 Jar 文件附加到數據庫中的代理時,客戶才會遇到持續的內存泄漏”

SPR # BHUY8PRMKK:“當使用附加的 Jar 文件到代理或腳本庫時,Java 內存泄漏。”

SPR # JSHN83MMMW:“帶有附加 JAR 文件的 Java 代理中的內存泄漏”

唯一可用的解決方法如下:從 Java 代理的項目中刪除 JAR 文件並將其放置在 jvm/lib/ext 文件夾中或通過 notes.ini 參數 JavaUserClasses 引用它。”

我知道這不是你想聽到的……但這些都是事實。 從那以后,我盡可能地使用 OSGi 插件。

暫無
暫無

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

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