我尝试启动需要大量内存的java进程。出于某种原因,如果我为进程指定了超过19G的RAM,它将不起作用。免费和顶级节目,我有23G的免费内存,所以我不知道为什么会出现这个错误。该系统有足够的内存,但“无法为对象堆预留足够的空间”
total used free shared buffers cached
Mem: 24158 1047 23111 0 16 356
-/+ buffers/cache: 673 23485
Swap: 2204 0 2204
开始与这些JVM选项的过程:
-XX:+UseConcMarkSweepGC -server -d64 -Xms4g -Xmx22g
版本:
java version "1.7.0_02"
Java(TM) SE Runtime Environment (build 1.7.0_02-b13)
Java HotSpot(TM) 64-Bit Server VM (build 22.0-b10, mixed mode)
但是,如果我指定19G的XMX它的工作原理。
所以-XX: MaxPermSize不包含在Xmx中? – user3111525 2012-01-10 12:37:32
不,它会单独计算您的总内存消耗! '-Xms'和'-Xmx'只能控制堆的大小。有关更多详细信息,请参阅[本文讨论](http://stackoverflow.com/questions/4223809/is-java-permgen-space-part-of-the-total-vm-memory)。 – r3nj1 2012-01-10 12:39:12
@frankmoss - 还有更多的东西不在堆中;线程堆栈,用于JVM映像的内存,用于内存映射文件和直接缓冲区的内存,由本地代码分配的内存使得'malloc'调用等等。 – 2012-01-10 12:42:55