Java 系统有足够的内存,但是;无法为对象堆保留足够的空间;
我正在尝试启动一个需要大量内存的java进程。出于某种原因,如果我为进程指定超过19G的RAM,它将不起作用。free和top显示我有23G的可用内存,所以我想知道为什么会发生这个错误Java 系统有足够的内存,但是;无法为对象堆保留足够的空间;,java,memory,ram,Java,Memory,Ram,我正在尝试启动一个需要大量内存的java进程。出于某种原因,如果我为进程指定超过19G的RAM,它将不起作用。free和top显示我有23G的可用内存,所以我想知道为什么会发生这个错误 total used free shared buffers cached Mem: 24158 1047 23111 0 16 356 -/+ buffers
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虚拟机为堆和永久空间分配内存。堆空间+永久空间的配置是否会超出可用内存
-XX:MaxPermSize
设置为哪个值 Java VM为堆和永久空间分配内存。堆空间+永久空间的配置是否会超出可用内存
-XX:MaxPermSize
设置为哪个值 从java文档中提取:
“通常,对于任何平台,您都不希望使用大于可用物理内存75%的最大堆大小设置。这是因为您需要在JVM中留出一些内存空间供内部使用。”
如果需要占用从java文档中提取的高达22gb的ram,那么听起来您应该检查该进程所做的任何事情: “通常,对于任何平台,您都不希望使用大于可用物理内存75%的最大堆大小设置。这是因为您需要在JVM中留出一些内存空间供内部使用。”
如果需要占用高达22gb的ram,您也应该查看该进程所做的任何操作是的,您正面临内存布局问题,因为正在进行近似计算: 进程大小(由Unix机器看到)=进程大小+堆大小+perm gen大小+堆栈大小 堆栈非常小(x Mb) 进程的大小(y Mb) 堆的大小=您想要的 perm gen可能取决于不同的参数,但包装很重要(尤其是在弹簧应用中) 不要忘记为您的Unix计算机保留足够的内存(停止所有未使用的服务),以避免交换,因为这对生产没有多大帮助 嗯
jerome是的,您正面临内存布局问题,因为正在进行近似计算: 进程大小(由Unix机器看到)=进程大小+堆大小+perm gen大小+堆栈大小 堆栈非常小(x Mb) 进程的大小(y Mb) 堆的大小=您想要的 perm gen可能取决于不同的参数,但包装很重要(尤其是在弹簧应用中) 不要忘记为您的Unix计算机保留足够的内存(停止所有未使用的服务),以避免交换,因为这对生产没有多大帮助 嗯
jeromeSo-XX:MaxPermSize不包括在Xmx中?不,它单独计入总内存消耗
-Xms
和-Xmx
仅控制堆的大小。更多细节请参见。@frankmoss-还有更多不在堆中的内容;线程堆栈、JVM映像的内存、内存映射文件和直接缓冲区的内存、由本机代码执行malloc
调用分配的内存等等。所以-XX:MaxPermSize不包括在Xmx中?不,它单独计入总内存消耗-Xms
和-Xmx
仅控制堆的大小。更多细节请参见。@frankmoss-还有更多不在堆中的内容;线程堆栈、用于JVM映像的内存、用于内存映射文件和直接缓冲区的内存、由本机代码进行malloc
调用分配的内存等等。