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