[英]Domino JVM memory and POI
我有一个代理,它使用 Apache POI 将笔记文档导出到 excel (xlsm)。 我正在通过使用 recycle() 或将对象设置为 null 来遵循各种可能的方法来释放内存。但是,JVM 仍然超出堆大小并抛出“内存不足”错误。 这里有更多信息,
我正在观察但无法理解的另一件事是 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.