Domino JVM内存和POI

时间:2017-09-29 15:14:16

标签: java jvm lotus-domino

我有一个使用Apache POI将注释文档导出到excel(xlsm)的代理。我正在通过使用recycle()或将对象设置为null来遵循一切可能的方式来释放内存。但是,JVM仍然会超出堆大小并抛出“内存不足”错误。以下是一些更多信息,

  • 默认堆大小= 256MB
  • POI版本 - 3.17
  • 错误发生频率如何?如果我连续5-6次从网上运行代理。
  • xlsm模板大小:90 kb
  • 撰写的记录数量 - 10-30

我观察但无法理解的另一件事是JVM如何使用/释放内存。例如,我在代码开始之前和代码结束之后使用以下代码打印“可用”内存

function.prototype

当我第一次测试我的代理时,它'打印出来,

  

JVM START:可用的初始内存:60 MB

     

JVM END:已用内存:90 MB

第二次代理人开始打印时,

  

JVM START:可用的初始内存:130 MB

     

JVM END:已用内存:160 MB

即使我在代码结束时释放内存,我发现它不会下降到初始内存(60 MB)?

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;
    }

1 个答案:

答案 0 :(得分:1)

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

  

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

     

SPR#BHUY8VML6R:"只有当Jar文件附加到数据库中的代理时,客户才会遇到正在进行的内存泄漏"

     

SPR#BHUY8PRMKK:"将附加的Jar文件用于代理或脚本库时Java内存泄漏。"

     

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

     

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

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