【发布时间】:2014-11-24 10:10:38
【问题描述】:
我们的一个 sap 系统(PI ABAP+JAVA 堆栈)出现性能问题。为机器配置的整个 64GB 被占用(以及 8 个核心)。每个人都在怀疑 java 部分,但我认为不同。
Java 服务器节点因内存不足错误而重新启动。查看 hprof 文件,我发现当为服务器节点配置 3GB(-Xms 和 Xmx)堆时,它们的大小只有 1.2G(平均 3 个服务器节点)。这一观察导致以下疑问。
我读过,当 Xms 和 Xmx 设置为相同的值时,jvm 在启动时会分配整个堆。如果是这种情况,服务器节点从一开始就有 3GB 的堆。如果是这样,为什么它没有反映在 hprof 文件中,或者如果 hprof 仅包含在运行时分配给对象的内存,那么大小清楚地表明堆内存是空闲的(超过 50%),那么 OOM 错误。 ..!!..??
我也知道 linux 会做一些称为内存过度提交的事情。即内存在请求时实际上并没有给出,而是在实际使用时给出。这是否导致内存不足异常。就像当 JVM 启动时操作系统告诉它你已经分配了 3GB 内存,但实际上将它推迟到它实际需要时。当 jvm 实际尝试将内存分配给 objects 时,其他一些应用程序可能已经耗尽了内存。这可能……??
即使 java 节点有内存泄漏问题,它不会被限制在 3GB 的堆中吗?怎么会霸占整个64G物理内存……???
我观察到的另一件事是交换空间仅使用了 50%。
任何关于这...!
【问题讨论】:
-
我认为您更有可能在 serverfault.com 上得到答案
-
谢谢..也发布在 serverfault 中
标签: java memory linux-kernel jvm sap