MemoryMXBean.getHeapMemoryUsage()

我有一个运行-Xms512m -Xmx512m的jvm进程,下面显示了此进程的MemoryMXBean.getHeapMemoryUsage():

    init     = 512M
    used     = 105M
    comitted = 491M
    max      = 491M
  • 为什么最大为491M(我希望是512M)?

  • MemoryMXBean.getNonHeapMemoryUsage()
    此过程的MemoryMXBean.getNonHeapMemoryUsage():
        init     = 2M
        used     = 25M
        comitted = 25M
        max      = 0M
    
  • 非堆(谁使用它)是什么意思?什么样的内存将计入此非堆中?我只知道我们在Java代码中使用的直接内存不会(对吗?)

  • -Xms
  • -Xms(初始堆大小)是什么意思?
    我曾经认为初始堆大小是jvm启动时jvm实际上将从操作系统分配多少内存,但事实证明这是错误的。
    顶部显示该jvm的RES接近150m,但是jvm是使用-Xms512M运行的。
  • 以下公式正确(或几乎正确-_-)吗?如果没有,也应该考虑什么?
  • total memory a jvm used = used of MemoryMXBean.getHeapMemoryUsage()
    + used of MemoryMXBean.getNonHeapMemoryUsage()
    + the direct memory we used in application level
    

    任何事情将不胜感激!

    最佳答案

    为什么最大为491M(我希望是512M)?
    max中不计入一个幸存者空间,因为其中一个幸存者空间始终为空。
    另请参见this answer

    非堆(使用它)是什么意思?
    MemoryMXBean将以下JVM内存池计为“非堆”:

  • 代码缓存(或代码堆)-编译方法和其他动态生成代码的区域;
  • 元空间和压缩的类空间-类元数据的区域。

  • 另请参见this question

    -Xms(初始堆大小)是什么意思?

    是的,这是初始堆大小。操作系统延迟(在第一次访问时)在物理内存中分配页面。这就是RSS可以小于总提交大小的原因。

    有关详细信息,请参见this answer

    以下公式正确吗

    不。事情要复杂得多。我已经在this answer中对此进行了详细说明。

    关于java - 如何理解java.lang.management.MemoryMXBean和-Xms?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54210134/

    10-08 22:33