java没有适当地保留巨大的初始堆大小

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (19)

我正在使用512GB RAM的单个机器(由几个AMD Opteron 6212 CPU寻址)。目前大约有300GB的RAM是免费的。运行一个大型的java计算

java path/to/myApp -Xms280g -Xmx280g > output.txt

应立即使Java保留280GB,并且如果失败则报错。奇怪的是,没有发生错误,但top只显示30.4GB的内存使用情况,但不会崩溃。这怎么会发生?如果不能分配初始堆大小,Java是不是应该崩溃?

实际上,一旦30.4GB已满,在280GB达到之前,就会出现OutOfMemory / Java堆空间/ GC开销限制错误。以250GB或300GB运行时,会产生类似的30.3GB〜30.4GB的限制。我在Gentoo Linux上使用OpenJDK运行环境(IcedTea6)运行OpenJDK 64位服务器VM,并且有大量可用RAM(超过300GB)。

提问于
用户回答回答于

参数的顺序不正确。您将-Xms280g -Xmx280g作为参数传递给您自己的程序,而不是传递给JVM。正确的是:

java -Xms280g -Xmx280g path/to/myApp

用户回答回答于

如果您希望在应用程序的初始化期间抓取-Xms中指定的内存,请使用

java -XX:+ AlwaysPreTouch -Xms2G -Xmx2G ......

AlwaysPreTouch将在JVM初始化期间要求每个内存页面,而不是仅仅保留“虚拟”不需要的内容页面。但是请注意,这在启动JVM时会有一些延迟。

使用上述开关,然后用顶部进行检查。您的JVM将获得完整的2G(实际上更多)。

扫码关注云+社区