[英]The system has enough memory but “Could not reserve enough space for object heap”
我正在尝试启动一个需要大量内存的Java进程。 由于某种原因,如果我为该进程指定了超过19G的RAM,它将无法正常工作。 free和top表示我有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,则可以使用。
Java VM为堆以及PermGen空间分配内存。 可能是您的堆空间+ PermGen空间配置超出了您的可用内存吗?
-XX:MaxPermSize
设置为哪个值?
从Java文档中提取:
“ 通常,对于任何平台,您都不想使用大于可用物理内存的75%的最大堆大小设置。这是因为您需要保留一些内存空间供JVM内部使用 ”。
这听起来也像您需要检查该过程所做的任何事情(如果它需要占用22GB的RAM)
是的,您因为执行近似的计算而面临内存布局问题:进程的大小(如您的Unix计算机所见)=进程的大小裸体+堆的大小+ perm gen的大小+堆栈的大小
堆栈的大小非常小(x Mb)进程的大小(y Mb)堆的大小=您想要的perm gen可能取决于不同的参数,但打包问题(尤其是Spring应用程序)
不要忘了给Unix机器留下足够的内存(停止所有未使用的服务),以避免交换,这对生产无济于事。
HTH热罗姆
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.