何时是操作系统分配的jvm堆

时间:2014-11-24 10:10:39

标签: java memory linux-kernel jvm sap

我们的一个sap系统(PI ABAP + JAVA堆栈)出现了性能问题。为机器配置的整个64GB都被占用了(以及8个内核)。每个人都怀疑java部分,但我认为不同。

使用Out Of Memory错误重新启动的java服务器节点。查看hprof文件,我发现它们的大小只有1.2G(平均3个服务器节点),当为服务器节点配置3GB(-Xms和Xmx)堆时。这种观察导致了以下疑问。

我已经读过,当Xms和Xmx设置为相同的值时,jvm会在启动时分配给整个堆。如果是这种情况,服务器节点从一开始就有3GB的堆。如果是这样,为什么它没有反映在hprof文件中,或者如果hprof只包含在运行时分配给对象的内存,则该大小清楚地表明堆内存是空闲的(超过50%),因此OOM如何出错。 .. !! ..?

我也知道linux会做一些称为内存过度提交的事情。即,当其请求但实际使用时,实际上并未给出内存。这是否导致内存不足异常。就像JVM启动时一样,os告诉它你已经分配了3GB的内存,但实际上是将它推迟到实际需要的时候。当jvm实际上尝试将内存分配给对象时,其他一些应用程序可能已经耗尽了内存。这可能...... ??

即使java节点有内存泄漏问题,也不会局限于3GB的堆。怎么能占用整个64G的物理内存.... ???

我观察到的另一件事是交换空间只使用了50%。

对此有任何启示......!

1 个答案:

答案 0 :(得分:0)

hprof没有显示实际的堆大小,其大小取决于许多因素,例如启用/禁用压缩引用,字段布局(对象大小不是&n;只是大小的总和它的字段,还有标题和字段之间的一些空白)等等。

关于记忆预约。 JVM确实为堆保留了内存,但操作系统在需要之前不会分配内存。

我建议您使用内存分析器(我强烈推荐YourKit分析器)连接到正在运行的虚拟机,然后分析内存使用情况。