我有一台服务器的内存问题。它是一个亚马逊微型实例,因此它的内存非常有限(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 的堆作为开销听起来太大了。那么这可能是什么原因呢?或者这是一种正常的方式?