Java 操作系统何时分配jvm堆

Java 操作系统何时分配jvm堆,java,memory,linux-kernel,jvm,sap,Java,Memory,Linux Kernel,Jvm,Sap,我们的一个sap系统(PI ABAP+JAVA堆栈)出现了性能问题。为机器配置的整个64GB内存被占用(以及8个内核)。每个人都在怀疑java部分,但我认为不同 重新启动时出现内存不足错误的java服务器节点。查看hprof文件,我发现它们的大小只有1.2G(3个服务器节点的平均值),而服务器节点的堆配置为3GB(包括-Xms和Xmx)。这一观察结果导致以下疑问 我已经读到,当Xms和Xmx被设置为相同的值时,jvm在启动时被分配给整个堆。如果是这种情况,服务器节点从一开始就有3GB的堆。如果是

我们的一个sap系统(PI ABAP+JAVA堆栈)出现了性能问题。为机器配置的整个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%


这上面有灯吗

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

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


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

我认为您更有可能得到关于serverfault的答案。谢谢..也发布在serverfault中