JVM内存消耗


9

我正在尝试在内存不足的系统(150-256Mb)上运行tomcat。即使我使用-Xmx64m(无论如何都应该是默认值)启动JVM,该过程仍会立即占用200Mb +。

我想知道为什么JVM本身需要这么多的内存,或者是否有一种调整方法?其他JVM在内存消耗方面是否比sun JVM更好-并且它们可以与tomcat一起使用吗?

Answers:


5

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

  • Perm Gen,最初在32位系统上为64mb,在64位系统上为96mb
  • 代码缓存,介于20到40mb之间,具体取决于JVM
  • NIO缓冲区(DirectByteBuffer从中提取s),最初是64mb

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

您还应该注意使用服务器类计算机时Sun JVM的自动调整大小随着时间的流逝,服务器类别(2Gb内存,一个以上内核)的定义遭受了折旧,现在大多数机器都能够触发-server优化。我的建议始终是指定-Xms-Xmx设置,然后通过,-server除非您可以想到一个很好的理由。


还请注意JVM仅保留并且尚未使用的虚拟内存。
史蒂夫·施内普

的确,大多数这些段(例如PermGen和代码缓存)是在启动时分配的,但是大多数内核会避免在需要之前将页面分配给这些段。
戴夫·切尼

1
感谢您提供的信息-我认为这可以说明内存的运行方向。有什么办法可以更改这些值?更好的方法是查看每个部分的使用量-我不知道是否有Java调试/监视工具允许您这样做?
德拉蒙2009年

1
您可以使用pmap或jmap来了解使用中的各个段。此处列出了大多数常用选项(及其默认值),它们为java.sun.com/javase/technologies/hotspot/vmoptions.jsp。它们经常更改,并且受操作系统(通常为堆栈大小)和架构(64位操作系统通常意味着较大的JVM区域)差异的影响
Dave Cheney

3

使用-Xmx选项,可以限制JVM保留的大小... JVM还需要其他资源...

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

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

但是,我认为内存不足的计算机不会对您有任何好处。Java只需要内存。

*由于新用户无法提交超链接,因此您必须自己查找该文章……这是Google上的第一款“感谢ibm的感谢”。




0

我发现的一种有用的技术是使用JMX监视来准确查看堆与permgen空间使用了多少内存。

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

然后使用JConsole(JDK 5或JDK 6附带)-内存标签将跟踪一段时间内的内存消耗。

另外-提防Web应用程序的软重启。如果重新加载Web应用程序,则不会垃圾收集permgen空间,并且该空间会随着时间的推移而累积。您需要完全停止/启动Tomcat,以便回收permgen空间。


在查找JVM中的内存问题时,也可以使用VisualVM代替JConsole,并提供更多详细信息。我不得不多次使用它来发现问题。
杰里米·布斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.