0

我有一个在 Jboss 5.1 中运行的应用程序,它每隔一周就会出现性能问题,我们必须重新启动应用程序以使其恢复正常。上图是在应用程序在高峰时段运行时捕获的。我试图从应用程序的角度了解在查看其他领域(如基础设施和网络)之前是否有改进的余地

通过 jvisualvm 生成的图表,显示堆使用情况

这是我为此应用程序获得的堆大小设置

JAVA_OPTS="${JAVA_OPTS} -Xms3072m -Xmx6144m -XX:PermSize=512m -XX:MaxPermSize=2048m -Dorg.jboss.resolver.warning=true -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Dsun.lang.ClassLoader.allowArraySyntax=true "
JAVA_OPTS="$JAVA_OPTS -verbose: gc -Xloggc:/test/log/gc.log -XX: +PrintGCDetails -XX:+PrintGCDateStamps"
  1. 为什么从图表中,应用程序仅使用 3G 内存,即使我已将 6G 作为最大内存?
  2. 我的 GC 设置是否正确?我可能从不同的服务器复制,我如何确保我有正确的 GC 设置这个应用程序?
  3. GC是否发生得太频繁了,如果我从设置中删除时间间隔,它将如何确定GC何时必须运行?
  4. 上次我们不得不重新启动应用程序并将其加载到 jvisualvm 时,我进行了堆转储,但我不知道在堆转储中寻找什么(我不是开发人员)有人能告诉我在堆转储中寻找什么以及如何改进它
  5. 从图表和 GC 设置中看到的内容,我们还能做些什么来提高应用程序性能
4

1 回答 1

0

以下是您对我的最佳能力的回答:

  1. 目前,您的应用程序对 3GB 堆感到满意,不需要增加它。大概它会随着它的进行而这样做,然后每隔一周就失败一次。
  2. GC 性能调优就是答案。你需要监控和调整,只有当你知道你在调整什么时。然后测量,记录。冲洗并重复。
  3. 它会在需要时运行 GC(当它的年轻代空间不足时)。它衡量了许多事情并考虑了各种设置来决定何时进行 GC。它会在没有任何帮助的情况下发生,但你可以告诉它更多的全局图,GC 试图建立它以调整自身。
  4. 您可以通过多种方式对其进行切片和切块。如此大量的信息产生了许多观点。您可以查看哪些类使用最多的内存,这可能表明问题出在哪里(我假设内存泄漏或其他一些系统资源,如文件句柄未释放)。有关VisualVM 的基本使用,请参见此处
  5. 你需要知道,是什么导致了问题。通常最好的办法是修复有问题的应用程序,而不是将负担转移到 GC。如果您有资源泄漏,无论如何它迟早会打击您。
于 2016-07-26T13:04:37.483 回答