我尝试在低内存系统 (150-256Mb) 上运行 tomcat。即使我使用 -Xmx64m (无论如何这应该是默认值) 启动 JVM,该过程也会立即占用 200Mb 以上。
我想知道为什么 JVM 本身需要这么多内存,或者是否有办法调整它?其他 JVM 是否比 sun 的内存消耗更低 - 它们可以与 tomcat 一起使用吗?
答案1
除了堆(由-Xms
和指定-Xmx
)之外,您还需要包括非堆区域。这些包括
- Perm Gen,在 32 位系统上最初为 64mb,在 64 位系统上最初为 96mb
- 代码缓存,大小在 20 到 40mb 之间,取决于 JVM
- NIO 缓冲区(
DirectByteBuffer
s 的来源),初始为 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 空间。