有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java操作系统何时分配jvm堆

我们的一个sap系统(PI ABAP+JAVA stack)出现了性能问题。为这台机器配置的整个64GB内存都被占用了(还有8个内核)。每个人都在怀疑java部分,但我的想法不同

java服务器节点在内存不足的情况下重新启动。查看hprof文件,我发现它们的大小只有1.2G(3个服务器节点的平均值),而服务器节点的堆配置为3GB(包括-Xms和Xmx)。这一观察结果引发了以下疑问

我已经读到,当Xms和Xmx被设置为相同的值时,jvm在启动时被分配给整个堆。如果是这样,服务器节点从一开始就有3GB的堆。如果是这样的话,为什么它不反映在hprof文件中,或者如果hprof只包含运行时分配给对象的内存,那么这个大小显然表明堆内存是空闲的(超过50%),那么OOM错误是怎么回事呢

我还知道linux做了一种叫做内存覆盖提交的事情。ie内存不是在被请求时给出的,而是在实际使用时给出的。这是导致内存不足异常的原因吗。比如,当JVM启动时,操作系统会告诉它,已经为您分配了3GB的内存,但实际上会将其推迟到实际需要时。当jvm实际尝试将内存分配给对象时,其他一些应用程序可能已经耗尽了内存。这可能吗

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

我还观察到,交换空间的使用率仅为50%

有什么线索吗


共 (1) 个答案

  1. # 1 楼答案

    hprof不显示实际的堆大小,它的大小取决于很多因素,比如启用/禁用的压缩引用、字段布局(对象大小不仅是字段大小的总和,还包括标题和字段之间的一些间隙)等等

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

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