JVM内存消耗

我试图在低内存系统(150-256Mb)上运行tomcat。 即使我使用-Xmx64m启动JVM(无论如何应该是默认设置),该进程立即占用200Mb +。

我想知道为什么JVM需要这么多内存本身,或者如果有一种调整方式呢? 其他的JVM比太阳更好的内存消耗低吗?他们是否使用tomcat?

除了堆(由-Xms-Xmx指定)之外,还需要包含非堆区。 这些包括

  • Perm Gen在32位系统上是64MB,在64位系统上是96mb
  • 代码caching,取决于JVM,介于20到40mb之间
  • NIO缓冲区(其中DirectByteBuffer是从哪里绘制的),最初是64MB

JVM本身也有几十MB的工作空间。

在使用服务器级机器时,您还应该了解Sun JVM的自动resize 。 随着时间的推移,服务器类 (2Gb内存,多个内核) 的定义遭受了一些折旧,现在大多数机器都能够触发服务器优化。 我的build议是总是指定-Xms-Xmx设置并传递服务器,除非你不能想到一个好的理由。

使用-Xmx选项可以限制JVM保留的的大小… JVM需要额外的资源…

“感谢内存”*是一篇很好的文章,解释了JVM如何使用内存…

除此之外,你可以尝试IBM的JVM,它应该与Tomcat一起工作,不知道是否有一些免费的JVM实现工作。

尽pipe如此,我并不认为这台机器的记忆能力很低,会对你有好处。 Java只需要内存。

*由于新用户不能提交超链接,你必须自己查阅这篇文章…这是第一次在谷歌的感谢“感谢内存ibm”。

还可以尝试JRockit JVM,它具有较less的内存占用。 您仍然可以免费下载获得BEA许可的JRockit版本。 即在Oracle接pipeBEA之前的版本。

有关下载链接,请参阅http://forums.oracle.com/forums/thread.jspa?threadID=816133&tstart=0

我发现的一个有用的技术是使用JMX监视来确切地看到堆vs permgen空间使用了多less内存。

在Tomcat中设置JMX,如http://tomcat.apache.org/tomcat-6.0-doc/monitoring.html所述

然后使用JConsole(附带JDK 5或JDK 6) – 内存标签将随着时间的推移跟踪内存消耗。

另外 – 要小心webapps的软重启。 如果你重新加载一个web应用程序,permgen空间将不会被垃圾收集,并将随着时间的推移而积累。 你需要做一个完整的停止/启动的Tomcat为了回收permgen空间。