Xpages/Domino Java 内存使用说明

Xpages/Domino Java Memory usage clarification

我们的其中一台服务器在使用某个特定的 XPages 应用程序时报告了间歇性性能问题。我的第一个想法是它与 Java 内存使用和代码回收不良有关,所以我从那里开始。目前,根据 Mark Leusink 出色的调试工具栏,服务器(具有 32Gb 物理 RAM 的 64 位 Windows 机器)的使用数据如下所示:

我想确认一下我对数字的理解:

  1. 最大堆大小 - 我对此很满意并且知道如何更改它(推荐设置是可用 RAM 的四分之一,但由于用户数量较少这台服务器,我确定 2Gb 绰绰有余)
  2. 总分配 - 这对我来说似乎很低,但我是正确的,因为这是由服务器自动设置的,如果需要更多 Java 内存,那么它将分配更多(最多达到最大堆大小中指定的数量?)是否仅当垃圾收集无法释放足够的 space 来加载新的 java 对象时才会发生这种情况?
  3. Used - 我相信这显示了整个服务器正在使用的内存,而不仅仅是包含调试工具栏本身的应用程序。这只会显示 Domino HTTP 任务(所有 XPage 应用程序)正在使用的内存,还是它也会受到 Java 代理的影响?

奖金问题:

谢谢

工具栏中显示的信息是JVM提供的标准数字:totalMemory()maxMemory()freeMemory()。有关详细说明,请参阅 this 问题。给出的三个值是针对整个 JVM,而不是特定应用程序。

在 Domino HTTP JVM 中,您可以使用 HTTPJVMMaxHeapSize notes.ini 参数设置 maxMemory。您不能设置/更改总分配 (totalMemory) 值,但这也不是必需的。 JVM 会在需要时简单地分配更多内存(最多 maxMemory 的值)。执行垃圾收集后,它最终也会再次释放该内存。

Java 代理不影响这些数字。唯一的例外是在 HTTP 进程中 运行 的 Java 代理(例如,使用 ?OpenAgent 命令从浏览器调用)。

在服务器上,如果 JVM 需要更多可分配的内存,您可以 运行 解决内存问题(OutOfMemory 异常)。您可以通过创建一个简单的 XAgent 来监视此值以输出 JVM 的当前值:

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" rendered="false" viewState="nostate">
  <xp:this.afterRenderResponse><![CDATA[#{javascript:

var externalContext = facesContext.getExternalContext();
var writer = facesContext.getResponseWriter();
var response = externalContext.getResponse();

response.setContentType("application/json"); 

response.setHeader("Cache-Control", "no-cache");

var max = java.lang.Runtime.getRuntime().maxMemory();
var free = java.lang.Runtime.getRuntime().freeMemory();
var total = java.lang.Runtime.getRuntime().totalMemory();

var memory = {
    max : max,
    total : total,
    free : free,
    available : (max - total) + free
};

writer.write( toJson(memory) ); 

writer.endDocument();
}]]>
  </xp:this.afterRenderResponse>
</xp:view>