【问题标题】:Why does JVM heap keep growing?为什么JVM堆不断增长?
【发布时间】:2015-04-25 16:29:03
【问题描述】:

我编写了一个简单的程序并使用 jconsole.exe 来监控它的堆大小。

public class HeapTest {
    public static void main(String[] args) {
        while(true) {
        }
    }
}

这是结果

我不明白为什么堆大小不断增长。我的程序中没有 new() 任何对象。

我的程序中使用的堆是什么?

我没有向 jconsole.exe 添加任何额外的参数;只需双击它,然后根据PID加载java进程。

环境:windows 7下Java 1.8.0_25

【问题讨论】:

  • 它可能在后台做一些事情,我敢肯定如果你点击perform GC(你不应该在live环境中),它会立即下降。
  • 有人能重现这种行为吗?看起来像无法重现的问题。我相信作者已经纠结于这个测量了
  • @Andremoniy - 是的。堆的增长速度确实令人怀疑。 JIT 很可能会将其优化为仅一条跳转指令。我不明白为什么这段代码会影响堆..
  • 我可以在 OSX 中复制它。看起来增长是在 Eden 空间中,一旦发生 GC,就会释放内存并重新开始该过程。它可能是两个 GC 之间的内务管理数据。
  • 看起来这是将 JConsole 附加到正在运行的 JVM 的某种开销。 JVM和JConsole之间的通信可以分配一些对象吗?

标签: java heap-memory


【解决方案1】:

这里没有内存泄漏。在 OSX 中也复制了它。这将是由 VM 的正常运行生成的簿记数据,包括用于 GC 的数据。 eden上升,一旦发生GC,堆(eden)使用的内存减少,循环重新开始。

令人困惑的方面是程序没有显式创建对象,但说明 JVM 会这样做是有道理的,因此伊甸园空间会逐渐增加,直到下一次 GC。

【讨论】:

    【解决方案2】:

    可以使用JConsole替代命令jmap监控java进程,可以发现java堆大小是固定的。

    【讨论】:

      【解决方案3】:

      您假设 main( ) 是您唯一的线程,这是一个错误的假设。还有其他线程会分配对象

      【讨论】:

        猜你喜欢
        • 2015-12-06
        • 2023-03-29
        • 2018-02-12
        • 2016-02-24
        • 1970-01-01
        • 2019-10-29
        • 2023-03-13
        • 2020-12-21
        • 2013-01-09
        相关资源
        最近更新 更多