执行手动GC后,生成堆转储会显着减少

时间:2012-04-17 19:21:36

标签: garbage-collection jvm heap-dump

这是我在堆栈溢出论坛中的第一篇文章。我们最近遇到了一些Java OOME问题,并使用jvisualvm,yourkit和eclipse mat工具来识别和修复一些问题......

在分析过程中观察到的一个行为是,当我们使用jconsole或jvisualvm手动创建堆转储时,生成堆转储后,jvm中使用的堆大小会急剧减少(从1.3 GB到200 MB)。 有人可以就这种行为提出建议吗?这是一个伪装的恩惠,因为每当我看到使用的堆大于1.5GB时,我执行一个manaul GC并且系统返回到较低的使用的堆大小数字,导致没有jvm重启。

让我知道任何其他细节

感谢 大师

2 个答案:

答案 0 :(得分:1)

当您使用JConsole创建转储文件时,有2个参数:第一个是要生成的文件名(完整路径),第二个(默认为true)表示您是否要在执行之前执行gc转储。如果在转储之前不需要完整的gc,请将其设置为false

答案 1 :(得分:0)

这是一个老问题,但我在问自己的新问题时发现了这个问题,所以我想我会回答它。

生成堆转储时,JVM在生成堆转储之前执行System.gc()操作,堆转储正在收集未引用的对象并有效地降低堆利用率。我实际上正在寻找一种方法来禁用该系统GC,以便我可以检查在我的JVM中搅拌的垃圾对象。