2013-12-17 34 views
2

假设您获得Java堆转储以分析内存泄漏(在-XX:+HeapDumpOnOutOfMemoryError之后或来自非受控方)。在Java堆转储上调用GC

如何通过调用某个GC进程来减少转储中的对象数量,这在任何情况下都会在转储过程后由GC进行清理?

回答

0

似乎是Eclipse的内存分析器Can I run Java garbage collection against a heap dump file?做到这一点:

By default unreachable objects are removed 

@Guntram布罗姆。正如你所说,OOME的原因是内存不足或者存储管理器无法回收足够的内存。如果你需要长阵列的碎片内存,可能根本没有执行GC!

4

如果在GC之后仍然没有足够的空间,Java将只会抛出内存不足错误。因此,没有减少对象的计数,堆中的每个对象仍然可以从某个位置访问,或者它将由OOM错误之前的GC清除。

+0

即使在'PermGen' GC保证执行? – gavenkoa

+0

@gavenkoa你不能转储PermGen,所以没有任何东西要删除。 –

+1

从JVM规范http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.3,第6.3节:OutOfMemoryError:“Java虚拟机实现已用完的虚拟或物理内存,并且自动存储管理器无法回收足够的内存以满足对象创建请求。“这意味着如果你在堆上请求了一个新的对象,或者如果你的对象本应该去那里的话,那么GC已经在堆上运行了。 –

1

可能的解决方案;

  • 调查内存泄漏时减小堆大小。这会产生一个较小的转储。
  • 使用像YourKit这样的商业工具,它不需要太多的内存来分析堆转储。
  • 使用更多内存。你可以购买约32美元的32 GB。

您不能转储PermGen,并且您的转储​​只有可到达的对象,或者您不会首先获得OOME。