繁体   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