Java dominojvm内存和POI

Java dominojvm内存和POI,java,jvm,lotus-domino,Java,Jvm,Lotus Domino,我有一个代理,它使用ApachePOI将notes文档导出到excel(xlsm)。我正在通过使用recycle()或将对象设置为null来释放内存,但JVM仍然超出堆大小并抛出“内存不足”错误。这里有更多的信息 默认heapsize=256MB POI版本-3.17 错误发生的频率有多高?如果我连续从web运行代理5-6次 xlsm模板大小:90 kb 记录写入数量-10-30 另一件我正在观察但无法理解的事情是JVM如何使用/释放内存。例如,我在代码开始前和代码结束后使用以下代码打印“可

我有一个代理,它使用ApachePOI将notes文档导出到excel(xlsm)。我正在通过使用recycle()或将对象设置为null来释放内存,但JVM仍然超出堆大小并抛出“内存不足”错误。这里有更多的信息

  • 默认heapsize=256MB
  • POI版本-3.17
  • 错误发生的频率有多高?如果我连续从web运行代理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

即使我在代码末尾释放内存,我看到它没有下降到初始内存(60MB)


去年我就这个问题开了一个PMR。IBM的回答如下:

我想通知您,这是一个已知的限制,将jar文件附加到代理或脚本库。请参见以下一些报告问题的SPR:

SPR#BHUY8VML6R:“只有当Jar文件附加到数据库中的代理时,客户才会遇到持续的内存泄漏”

SPR#BHUY8PRMKK:“当使用附加到代理或脚本库的Jar文件时,Java内存泄漏。”

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

唯一可用的解决方法如下:从Java代理的项目中删除JAR文件,并将其放在jvm/lib/ext文件夹中,或者通过notes.ini参数JavaUserClasses引用它。”


我知道这不是你想听到的…但这些都是事实。从那时起,我尽可能使用OSGi插件。

你把POI的jar放在哪里?放在数据库中还是放在domino服务器的文件系统中?我放在数据库中,如果放在文件系统中,很难在服务器上分发应用程序。此外,我不知道'不需要任何管理员依赖项。
        /* 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();