【问题标题】:Why does the JVM consume less memory than -Xms specified?为什么JVM消耗的内存比-Xms指定的少?
【发布时间】:2021-07-31 17:22:21
【问题描述】:

我的问题如题,通过搜索了解了一些知识:

  1. linux 有共享内存 How to measure actual memory usage of an application or process?

  2. JVM 将保留 Xms 中设置的内存量 What does the -Xms JVM mean in reference to heap memory?

但还是不知道为什么,有的可以帮忙吗?

这是我在 Ubuntu12.04(64bit) 上运行的测试 | JDK 1.7.0_04。顶部显示如下:

  PID USER      PR  NI  VIRT  RES       SHR S %CPU %MEM    TIME+  COMMAND
 4067 brian     20   0 5316m **262m** 7496 S    0  3.3   0:00.30 java -**Xms4096m** -Xmx4096m Test
 4066 brian     20   0 3182m **256m** 7496 S    0  3.3   0:00.30 java -**Xms2048m** -Xmx2048m Test
 4065 brian     20   0 2114m **252m** 7492 S    0  3.2   0:00.30 java -**Xms1024m** -Xmx1024m Test
 4064 brian     20   0 1314m  **76m** 7584 S    0  1.0   0:00.20 java -**Xms256m** -Xmx256m Test
 4063 brian     20   0 1180m  **51m** 7608 S    0  0.7   0:00.21 java -**Xms128m** -Xmx128m Test

【问题讨论】:

    标签: java linux garbage-collection jvm


    【解决方案1】:

    您正在查看驻留内存 - 即消耗的物理 RAM。请参阅here 了解更多信息。

    虚拟内存是应用程序消耗的内存,包括换出(到磁盘)的内存。您会看到与虚拟内存和您的-Xms 设置有更密切的对应关系。

    请参阅this ServerFault answer 了解更多信息。

    【讨论】:

    • 正要问“为什么我的内存充裕时还要使用交换”。并从您附加的网址中得到答案...谢谢!
    • 那么 RES 内存什么时候会增长到 xms 呢?我有一个xms和xmx = 6g的进度,它引导后,RES是4g,一天后是5.9g,但是当我转储堆时,它只有3.9g。那么 jvm 是否会在需要的时候继续消耗内存直到 xms,即使内存中使用的对象不需要那么多?
    【解决方案2】:

    当您的 JVM 启动时,它会将您的最大堆大小保留为启动时的一个连续虚拟内存块。但是,只有实际使用的页面成为常驻页面(实际主存)

    当您设置最小大小时,它不会强制 JVM 在不需要时使用那么多内存。取而代之的是,到现在为止,减少内存并不费力(您可能仍然会看到一些较小的集合)在大多数应用程序中,几乎立即达到最小大小,但是“hello world”程序将使用相同的内存,无论您设置多大最小尺寸。

    【讨论】:

    • 所以你的意思是,如果我设置 xms=xmx=6g,即使我只有 4g 可达对象,大多数时候 gc 也不会触发?
    猜你喜欢
    • 1970-01-01
    • 2013-06-13
    • 2010-09-17
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    相关资源
    最近更新 更多