我有一个使用Apache POI将注释文档导出到excel(xlsm)的代理。我正在通过使用recycle()或将对象设置为null来遵循一切可能的方式来释放内存。但是,JVM仍然会超出堆大小并抛出“内存不足”错误。以下是一些更多信息,
我观察但无法理解的另一件事是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;
}
答案 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插件。