【问题标题】:when is the jvm heap allocated by the OS操作系统何时分配 jvm 堆
【发布时间】: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


【解决方案1】:

hprof 没有显示实际的堆大小,它的大小取决于很多东西,比如启用/禁用压缩引用、字段布局(对象大小不仅仅是其字段大小的总和,还包括标题以及字段之间的一些差距)等等。

关于内存保留。 JVM 确实为堆保留内存,但操作系统在需要时才分配内存。

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

【讨论】:

    猜你喜欢
    • 2011-05-04
    • 2014-05-27
    • 1970-01-01
    • 2016-08-06
    • 1970-01-01
    • 2013-06-26
    • 2013-04-22
    • 2014-07-19
    • 2020-09-26
    相关资源
    最近更新 更多