8

我有一台服务器的内存问题。它是一个亚马逊微型实例,因此它的内存非常有限(free -m 表示 603 MB)。这就是为什么我开始使用tomcat

-server -Xmx290m -Xms290m -XX:MaxPermSize=65m

但是,“java”进程占用了大约 86% 的总内存,即 518M。518-355 = 163 MB 开销。这看起来很多,而且很可疑,尤其是考虑到:

  • 在另一个微型实例上的另一个 jvm 版本上运行的类似应用程序没有这么大的开销
  • 本地运行的相同应用程序仅产生 40 MB 开销。在本地,它在 Windows 7 64 位中运行。

有问题的服务器上的 java 版本是:

java version "1.7.0_09-icedtea"
OpenJDK Runtime Environment (amzn-2.3.3.13.amzn1-x86_64)
OpenJDK 64-Bit Server VM (build 23.2-b09, mixed mode)

本地运行时和服务器上的运行时之间的巨大差异使我排除了应用程序中有一些昂贵的堆外对象(例如字节缓冲区)的选项(无论如何我都没有使用这些对象)。我知道 JVM 开销会有所不同,但是超过 1/2 的堆作为开销听起来太大了。那么这可能是什么原因呢?或者这是一种正常的方式?

4

1 回答 1

2

GC 的选择可能会影响堆大小开销,因为每个 GC 方案都必须留出一些内存来管理您的堆。此外,在如此小的 VM 上,您可能不会从 64 位中受益多少。32 位 jvm 占用的堆空间更少,即使使用 CompressOOPS(默认情况下应该打开)也是如此。因此,与您最喜欢的垃圾收集器一起玩,选择一个为您提供最佳开销和延迟组合的垃圾收集器。

于 2013-01-03T16:28:35.710 回答