如何理解java.lang.management.MemoryMXBean和-Xms?

时间:2019-01-16 03:47:00

标签: java jvm

MemoryMXBean.getHeapMemoryUsage()

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

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

MemoryMXBean.getNonHeapMemoryUsage() 此过程的MemoryMXBean.getNonHeapMemoryUsage():

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

-Xms

  1. -Xms(初始堆大小)是什么意思? 我曾经认为初始堆大小是jvm启动时jvm实际上将从操作系统分配多少内存,但事实证明这是错误的。 顶部显示该jvm的RES接近150m,但是jvm是使用-Xms512M运行的。

  2. 以下公式正确(或几乎正确-_-)吗?如果没有,那么也应该考虑什么?

total memory a jvm used = used of MemoryMXBean.getHeapMemoryUsage() 
+ used of MemoryMXBean.getNonHeapMemoryUsage()
+ the direct memory we used in application level

任何事情都将不胜感激!

1 个答案:

答案 0 :(得分:1)

  

为什么最大为491M(我希望是512M)?

max中未计入一个幸存者空间,因为其中一个幸存者空间始终为空。
另请参见this answer

  

不使用堆的人是什么意思?

MemoryMXBean将以下JVM内存池计为“非堆”:

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

另请参阅this question

  

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

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

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

  

下面的公式正确吗

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