我有一台服务器的内存问题。这是一个亚马逊微实例,所以它的内存非常有限(free -m表示603 MB)。这就是我用
开始tomcat的原因-server -Xmx290m -Xms290m -XX:MaxPermSize=65m
但是,“java”进程大约占总内存的86%,即518M。 518-355 = 163 MB开销。这看起来很多,并且是可疑的,特别是给出了:
有问题的服务器上的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的堆的开销听起来太大了。那可能是什么原因呢?或者这是正常的事情方式?
答案 0 :(得分:2)
GC的选择可能会影响堆大小开销,因为每个GC方案都必须留出一些内存来管理堆。此外,在如此小的虚拟机上,你可能无法从64位上获益。即使使用CompressOOPS,32位jvm也会占用较少的堆,默认情况下应该打开它。 因此,与您最喜欢的垃圾收集器一起玩,选择能够为您提供最佳开销和延迟的组合。