【发布时间】: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