0

我们有一个在 JBoss 7.1.1 中运行的 Java EE 应用程序,我们必须在 VirtualMachines(例如 VMWare ESXI)中运行它。

问题是,当我们在 VM 中运行我们的应用程序时,性能下降了大约 50%。

似乎 GC 疯了......据我所知,当 GC 运行时,“结束”所需的时间比正常情况要长得多,同时阻塞应用程序。

其他人有过这样的经历吗?我可以遵循任何提示、调音或灯光吗?

提前致谢。


编辑

  • JVM 有 Xmx 和 Xms = 1Gb
  • 虚拟机有 4Gb 内存
  • Ubuntu 服务器 64
  • 甲骨文 JVM 64
4

1 回答 1

0

我想说的是,在将您的应用程序移动到具有您发布的配置的 VM 之前,它在 32 位系统和 32 位 jvm 上运行并使用相同的 jvm 参数。

诀窍是您使用 64 位 java 迁移到 64 位,但仍然为您的应用程序分配了相同数量的堆大小,实际上发生的情况是您的应用程序现在拥有的可用内存是以前的一半。64 位 jvm 上的每个对象的大小都是 32 位 jvm 的两倍。

鉴于您的配置,我会建议一些解决方案:

  • 将堆大小增加到 2G
  • 或使用压缩的oops
  • 或者安装 32bit jvm

鉴于您的应用程序分配的内存不超过 1.3G,它认为通过安装 32 位 jvm 并使用 -Xms1300m -Xmx1300m 运行可以实现最佳性能。

您甚至可以更进一步,安装 32 位 linux 并安装 32 位 VM。64 位 jvm 仅在您需要超过 1.3G 的堆时才有用,否则只会增加太多开销。

你也可以运行jvm

-verbose:gc -XX:+PrintGCDetails

这将向您展示 GC 发生了什么,这可以进一步帮助您调整 jvm。

于 2013-03-29T00:45:34.957 回答