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

2024-01-14

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实际从os分配多少内存,但事实证明是错误的。 顶部显示该 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

任何事情都会受到赞赏!


为什么最大是491M(我预计是512M)?

1 个幸存者空间不计入max,因为幸存者空间之一始终是空的。
也可以看看这个答案 https://stackoverflow.com/a/27012218/3448419.

非堆(谁使用它)是什么意思?

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

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

也可以看看这个问题 https://stackoverflow.com/questions/39329455/java-non-heap-memory-analyzes.

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

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

See 这个答案 https://stackoverflow.com/a/31178912/3448419了解详情。

下面的公式正确吗

不,事情要复杂得多。我已经详细解释过这一点这个答案 https://stackoverflow.com/a/53624438/3448419.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何理解java.lang.management.MemoryMXBean和-Xms? 的相关文章

随机推荐