2013-01-03 31 views
7

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

-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的堆作为开销听起来太大了。那可能是什么原因呢?或者这是一种正常的事情吗?

+0

当你在本地运行时,你还添加了-server吗?你在本地有什么JVM? – Sorin

+0

Oracle JDK,7,64位(我现在不在家中,因此我暂时无法提供更多细节)。我不确定关于服务器切换,这是一个很好的观点。我会尝试的。 – Bozho

+0

它没有任何开关如何反应?即默认? – epoch

回答

2

GC的选择可能会影响堆大小的开销,因为每个GC方案必须留出一些内存来管理堆。而且,在这样一个小型的虚拟机上,你可能不会从64位获得太多好处。一个32位jvm将占用较少的堆,即使在使用CompressOOPS时,它应该默认打开。 因此,玩你最喜欢的垃圾收集器,选择一个给你的开销和延迟的最佳组合。

+0

感谢您的答案。设置-XX:+ UseCompressedOops,并添加无头= true改善了一些事情。但是,仍然使用483 MB,其中350是为堆+ permgen保留的。可能调整GC会产生额外的影响,但窗口和linux jvms之间的差异看起来很奇怪。 – Bozho

+1

如果你想成为额外的彻底,请尝试以下:
-XX:+ UnlockDiagnosticVMOptions -XX:+ PrintFlagsFinal -XX:+ LogVMOutput -XX:日志文件= jvm.log
然后比较输出看针对两个版本之间的不同标志
您可以在亚马逊试用Oracle Java吗? –

+0

很好,谢谢.. – Bozho