【问题标题】:Xpages/Domino Java Memory usage clarificationXpages/Domino Java 内存使用说明
【发布时间】:2018-11-08 01:00:09
【问题描述】:

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

我想确认我对这些数字的理解:

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

额外问题:

  • “总分配”数字最初是如何设置的?在我们拥有的开发服务器上(有一个当前用户 - 我),该数字当前设置为 256M,但我无法将其与任何 Notes.ini 参数相关联。 (另外,这个图有推荐值吗?)
  • 如果我在达到“总分配”数字时运行垃圾收集的说法是正确的,那么大概是一个较低的数字会迫使它更频繁地运行。这会对服务器性能产生不利影响吗?
  • 我们是否应该考虑我们也在此服务器上运行 Traveler(尽管只有大约 9 个用户)这一事实?

谢谢

【问题讨论】:

  • 你似乎有足够的内存。寻找性能问题的根源,似乎不是内存。从分析您的应用程序开始。 openntf.org/main.nsf/project.xsp?r=project/XPages%20Toolbox
  • 谢谢。我实际上根本不认为这是应用程序,但我需要能够明确地证明它。我忘记了工具箱——它甚至可能已经安装了——所以也会看看。

标签: jvm xpages lotus-domino


【解决方案1】:

工具栏中显示的信息是 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>

【讨论】:

  • 谢谢马克,非常有用且内容丰富。我已经阅读了您链接到的帖子,但想确保我对它的理解是正确的。我强烈怀疑这里还有其他因素在起作用,但需要排除明显的因素。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-16
  • 2022-12-14
  • 1970-01-01
  • 1970-01-01
  • 2012-12-12
  • 2012-05-26
相关资源
最近更新 更多