Java 为什么JVM堆不断增长?
我编写了一个简单的程序,并使用jconsole.exe监视其堆大小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下
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之间的通信可以分配一些对象吗?