系统有足够的内存,但“无法为对象堆保留足够的空间”

时间:2012-01-10 12:10:27

标签: java memory ram

我尝试启动一个需要大量内存的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则可行。

3 个答案:

答案 0 :(得分:1)

Java VM为堆以及PermGen空间分配内存。可能是你的堆空间+ PermGen空间的配置超过你的可用内存吗?

-XX:MaxPermSize设置为哪个值?

答案 1 :(得分:0)

从java docs中提取:

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

听起来你应该回顾一下如果它需要占用22gb的ram那个过程会做什么

答案 2 :(得分:0)

是的,您正面临内存布局问题,因为进行了近似计算: 进程的大小(由你的Unix机器看到)=进程裸的大小+堆的大小+ perm gen的大小+堆栈的大小

堆栈非常小(x Mb) 过程的大小(y Mb) 堆的大小=你想要的 perm gen可能取决于不同的参数,但包装很重要(特别是使用Spring应用程序)

不要忘记为你的Unix机器留下足够的内存(停止所有未使用的服务)以避免交换,这对生产过程没有多大帮助

HTH 杰罗姆