我正在运行一个简单的"hello world"Web服务器项目,其中包含maven,jetty,scala,scalate和scalate-ssp。
使用"MVN jetty:run"运行项目,需要120Mb的RSS内存(ps -o rss,etime,pid,command)。
但是,在另一台计算机上运行完全相同的项目会占用 480Mb 的 RSS 内存。
第一台计算机,Mac:uname -a
Darwin mac.local 11.4.0 Darwin Kernel Version 11.4.0: Mon Apr 9 19:32:15 PDT 2012; root:xnu-1699.26.8~1/RELEASE_X86_64 x86_64
第二台计算机,Linux:uname -a
Linux linux.local 2.6.32-220.2.1.el6.x86_64 #1 SMP Fri Dec 23 02:21:33 CST 2011 x86_64 x86_64 x86_64 GNU/Linux
什么可以解释这种差异?
我有一个内存有限的环境。 如何减少第二台计算机的 RSS 内存?
从joakime的答案更新:
苹果电脑:
Java HotSpot(TM)
Java version: 1.6.0_33, vendor: Apple Inc.
Apache Maven 3.0.3 (r1075438; 2011-02-28 18:31:09+0100)
Linux:
OpenJDK
Java version: 1.6.0_24, vendor: Sun Microsystems Inc.
Apache Maven 3.0.4 (r1232337; 2012-01-17 09:44:56+0100)
Runtime.getRuntime().maxMemory() 对于 mac 是 120Mb,对于 linux 是 3500Mb。
现在我运行:
export MAVEN_OPTS="-Xmx256m -Xms10m"; mvn jetty:run
有了这个,在linux上,Runtime.getRuntime().maxMemory()现在给出了227Mb(而不是3500Mb)。
但是,执行"ps -o rss,etime,pid,command"仍然提供430Mb的RSS内存。我需要 RSS 内存小于 250Mb。
如何实现这一点?
如果没有更多信息,我将推测您有不同的 JVM 实现(1 个 linux,1 个 OSX),并且可能没有指定这些 JVM 的内存上限。
请注意,不同的 JVM 可能会指定不同的内存上限默认值。即使是 oracle 的相同 JVM 版本,也会在不同的操作系统/硬件组合上以不同的方式指定不同的最大内存限制。
关于这个主题,有一个先前的问题可能会有所帮助:Java SE 6 中 Sun 的 JVM 的默认最大堆大小是多少?
此外,maven 版本在默认情况下使用的插件版本上也有所不同,您可能会有完全在 maven + 其插件范围内的差异。