2012-01-10 49 views
1

我尝试启动需要大量内存的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它的工作原理。

回答

1

Java VM为堆和PermGen空间分配内存。难道你的配置有堆空间+ PermGen空间超过了你的空闲内存吗?

哪个值是-XX:MaxPermSize设置为?

+0

所以-​​XX: MaxPermSize不包含在Xmx中? – user3111525 2012-01-10 12:37:32

+0

不,它会单独计算您的总内存消耗! '-Xms'和'-Xmx'只能控制堆的大小。有关更多详细信息,请参阅[本文讨论](http://stackoverflow.com/questions/4223809/is-java-permgen-space-part-of-the-total-vm-memory)。 – r3nj1 2012-01-10 12:39:12

+1

@frankmoss - 还有更多的东西不在堆中;线程堆栈,用于JVM映像的内存,用于内存映射文件和直接缓冲区的内存,由本地代码分配的内存使得'malloc'调用等等。 – 2012-01-10 12:42:55

0

从Java文档中提取:

通常情况下,对于任何平台,你不希望使用更大的最大堆大小设置比可用物理内存的75%,这是因为你需要留一些可用于JVM内部使用的内存空间“。

它也听起来像你应该检讨无论是工艺的确,如果它需要占用到内存的22GB的

0

是你所面临的内存布局问题,因为做一个近似计算: 规模的过程中(如由你的Unix机器可见)=栈的烫发根+大小的堆+大小的处理裸鼠+大小的大小

堆是相当小的(X MB) 大小的方法的(Y MB) 大小堆=你想要什么 烫发可能取决于不同的参数,但包装问题(特别是与春季应用程序)

不要忘记留下足够的内存来你的Unix机器(停止所有未使用的服务),以避免交换,不会帮助你很多在生产

HTH 杰罗姆

相关问题