Java 为什么JVM堆不断增长?

Java 为什么JVM堆不断增长?,java,heap-memory,Java,Heap Memory,我编写了一个简单的程序,并使用jconsole.exe监视其堆大小 public class HeapTest { public static void main(String[] args) { while(true) { } } } 结果如下 我不明白为什么堆的大小一直在增长。我的程序中没有任何对象 堆在我的程序中用于什么 我不向jconsole.exe添加任何附加参数;只需双击它,然后根据PID加载java进程 环境:windows 7下

我编写了一个简单的程序,并使用jconsole.exe监视其堆大小

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

我不明白为什么堆的大小一直在增长。我的程序中没有任何对象

堆在我的程序中用于什么

我不向jconsole.exe添加任何附加参数;只需双击它,然后根据PID加载java进程


环境:windows 7下的Java 1.8.0_25这里没有内存泄漏。在OSX中也复制了它。它将是VM正常运行(包括GC)生成的簿记数据。eden上升,一旦GC发生,堆(eden)使用的内存就会减少,循环再次开始


令人困惑的是,程序没有明确创建任何对象,但有必要解释一下JVM将这样做,从而逐渐增加eden空间,直到下一个GC。

您可以使用JConsole替代命令jmap monitor java process,您可以发现java堆大小是固定的。

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

它可能在后台执行某些操作,我确信如果您单击“执行GC”(您不应该在实时环境中执行),它将立即停止。有人可以重现这种行为吗?看起来像是无法生产的问题。我相信作者与此有牵连measuring@Andremoniy-是的。堆的增长速度确实令人怀疑。JIT很可能会将其优化为仅一条跳转指令。我不明白为什么这段代码会影响堆。我可以在OSX中复制它。似乎增长是在伊甸园空间,一旦GC发生,内存被释放,过程再次开始。它可能是两个GC之间的内务管理数据。看起来这是将JConsole连接到运行中的JVM的某种开销。JVM和JConsole之间的通信可以分配一些对象吗?