我正在使用 VisualVM + VisualGC 分析此工具的内存使用情况。我注意到一些我没有预料到的事情,这可能暴露了我对 JVM 和堆转储的误解。
为了给出完整的上下文,我正在分析的应用程序会查找一个巨大的序列化 blob,然后我正在打印使用jamm的大小。之后,该应用程序就坐在那里等待中止。
使用 VisualVM,我看到堆使用量按预期增长。一旦操作完成并且应用程序只是坐在那里睡觉,我会使用 VisualVM 触发一次 GC(或者更确切地说,是多个 GC,点击按钮我会忘乎所以)。
- 此时已用堆为 ,
1,849,825,472 bytes
PermGem 已用空间为25,864,448 bytes
. 此时,我执行了一个堆转储,这显然需要一段时间,但是当堆转储完成时,使用的堆仍然
1,944,542,296 bytes
与 PermGen 大致相同25,892,800 bytes
。重点是:堆转储显示的总字节数为
2,299,816,089
.
什么可以解释这种差异?我重复了几次实验,我总是得到相同的结果。