在Java堆转储上调用GC

时间:2013-12-17 14:17:24

标签: java debugging visualvm

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

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

3 个答案:

答案 0 :(得分:4)

如果在GC之后仍然没有足够的空间,Java将只会引发内存不足错误。因此,没有对象计数可以减少,堆中的每个对象仍然可以从某个地方到达,或者它会在OOM错误之前由GC清理。

答案 1 :(得分:1)

可能的解决方案;

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

您无法转储PermGen,您的转储只有可到达的对象,或者您首先没有OOME。

答案 2 :(得分:0)

似乎Eclipse Memory Analyzer Can I run Java garbage collection against a heap dump file?这样做:

By default unreachable objects are removed

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