题 JVM内存消耗


我试图在低内存系统(150-256Mb)上运行tomcat。即使我使用-Xmx64m(默认情况下应该是默认值)启动JVM,该过程也会立即占用200Mb +。

我想知道为什么JVM本身需要这么多内存,或者有没有办法调整它?其他JVM是否比Sun更好用于低内存消耗 - 它们是否与tomcat一起使用?


9
2018-05-23 18:17






答案:


除了堆(由。指定) -Xms 和 -Xmx)你需要包括非堆区域。这些包括

  • Perm Gen,在32位系统上为64mb,最初在64位系统上为96mb
  • 代码缓存,取决于JVM,介于20和40mb之间
  • NIO缓冲区(其中 DirectByteBuffers来自),这最初是64mb

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

你也应该知道 Sun JVM在使用服务器类机器时自动调整大小随着时间的推移,服务器类的定义 (2Gb内存,多个核心)已经遭受了一些折旧,现在大多数机器都能够触发 -server 优化。我的建议是始终指定 -Xms 和 -Xmx 设置和通过 -server 除非你能想到一个很好的理由。


5
2018-05-26 11:40



还要注意JVM只保留但尚未使用的虚拟内存。 - Steve Schnepp
确实,大多数这些段,如PermGen和代码缓存都是在启动时分配的,但是大多数内核都会避免在需要之前将页面分配给这些段。 - Dave Cheney
感谢您的信息 - 我认为这解释了内存的发展方向。有没有办法改变这些价值观?更好的方法是查看每个部分的使用情况 - 我不知道是否有任何Java调试/监控工具可以让你这样做? - Draemon
您可以使用pmap或jmap来了解正在使用的各个段。这里列出了大多数常见选项(及其默认值), java.sun.com/javase/technologies/hotspot/vmoptions.jsp。它们经常变化并且受OS(通常的堆栈大小)和arch(64位OS通常意味着更大的JVM区域)的差异的影响 - Dave Cheney


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

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

除了你可以尝试IBM的JVM,它应该与Tomcat一起使用,不知道是否有一些免费的JVM实现。

尽管如此,我不认为那台内存很低的机器会对你有所帮助。 Java只需要内存。

*由于新用户无法提交超链接,您必须自己查找该文章...这是Google首次点击“感谢内存ibm”。


3
2018-05-26 11:20



ibm.com/developerworks/java/library/j-nativememory-linux  - 链接到文章“感谢记忆” - StackKrish


还可以尝试JRockit JVM,它具有更少的内存占用。您仍然可以免费下载BEA许可的JRockit版本。即Oracle收购BEA之前的版本。

看到 http://forums.oracle.com/forums/thread.jspa?threadID=816133&tstart=0 下载链接。


2
2018-06-19 13:26





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

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

然后使用JConsole(随JDK 5或JDK 6一起提供) - 内存标记将跟踪内存消耗。

另外 - 小心webapps的软重启。如果你重新加载一个webapp,permgen空间将不会被垃圾收集,并会随着时间的推移而积累。您需要完全停止/启动Tomcat才能回收permgen空间。


0
2017-07-19 04:42



在查找JVM中的内存问题时,也可以使用VisualVM代替JConsole并提供更多详细信息。我不得不不止一次地使用它来发现问题。 - Jeremy Bouse