JVM 内存消耗

JVM 内存消耗

我尝试在低内存系统 (150-256Mb) 上运行 tomcat。即使我使用 -Xmx64m (无论如何这应该是默认值) 启动 JVM,该过程也会立即占用 200Mb 以上。

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

答案1

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

  • Perm Gen,在 32 位系统上最初为 64mb,在 64 位系统上最初为 96mb
  • 代码缓存,大小在 20 到 40mb 之间,取决于 JVM
  • NIO 缓冲区(DirectByteBuffers 的来源),初始为 64mb

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

您还应该了解使用服务器类计算机时 Sun JVM 的自动调整大小随着时间的推移服务器类的定义(2GB 内存,多核)已经有所贬值,现在大多数机器都能够触发优化-server。我的建议是始终指定-Xms-Xmx设置并传递,-server除非你能想到一个不这样做的好理由。

答案2

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

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

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

尽管如此,我认为内存这么低的机器对你没有任何好处。Java 只需要内存。

*由于新用户无法提交超链接,您必须自己查找该文章...它是在 Google 上搜索“感谢 IBM 的记忆”的第一个结果。

答案3

还可以尝试 JRockit JVM,它占用的内存较少。您仍然可以免费下载 BEA 授权的 JRockit 版本。即 Oracle 接管 BEA 之前的版本。

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

答案4

我发现一个有用的技巧是使用 JMX 监控来准确查看堆和 permgen 空间使用了多少内存。

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

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

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

相关内容