我试图在低内存系统(150-256Mb)上运行tomcat。 即使我使用-Xmx64m启动JVM(无论如何应该是默认设置),该进程立即占用200Mb +。
我想知道为什么JVM需要这么多内存本身,或者如果有一种调整方式呢? 其他的JVM比太阳更好的内存消耗低吗?他们是否使用tomcat?
除了堆(由-Xms和-Xmx指定)之外,还需要包含非堆区。 这些包括
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空间。