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