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

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

我正在尝试启动一个需要大量内存的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虚拟机为堆和永久空间分配内存。堆空间+永久空间的配置是否会超出可用内存


-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计算机保留足够的内存(停止所有未使用的服务),以避免交换,因为这对生产没有多大帮助


jerome

So-XX:MaxPermSize不包括在Xmx中?不,它单独计入总内存消耗
-Xms
-Xmx
仅控制堆的大小。更多细节请参见。@frankmoss-还有更多不在堆中的内容;线程堆栈、JVM映像的内存、内存映射文件和直接缓冲区的内存、由本机代码执行
malloc
调用分配的内存等等。所以-XX:MaxPermSize不包括在Xmx中?不,它单独计入总内存消耗
-Xms
-Xmx
仅控制堆的大小。更多细节请参见。@frankmoss-还有更多不在堆中的内容;线程堆栈、用于JVM映像的内存、用于内存映射文件和直接缓冲区的内存、由本机代码进行
malloc
调用分配的内存等等。