【发布时间】:2014-12-09 00:58:01
【问题描述】:
假设您获取 Java 堆转储来分析内存泄漏(在-XX:+HeapDumpOnOutOfMemoryError 之后或来自非受控方)。
如何通过调用一些 GC 进程来减少转储中的对象计数,这些进程在转储过程后无论如何都会被 GC 清理?
【问题讨论】:
假设您获取 Java 堆转储来分析内存泄漏(在-XX:+HeapDumpOnOutOfMemoryError 之后或来自非受控方)。
如何通过调用一些 GC 进程来减少转储中的对象计数,这些进程在转储过程后无论如何都会被 GC 清理?
【问题讨论】:
如果在 GC 之后仍然没有足够的空间,Java 只会抛出内存不足错误。因此,没有可减少的对象计数,堆中的每个对象仍然可以从某个地方访问,否则它会被 OOM 错误之前的 GC 清理。
【讨论】:
PermGen GC 保证执行?
可能的解决方案;
您不能转储 PermGen,并且您的转储只有可访问的对象,否则您一开始就不会获得 OOME。
【讨论】:
似乎 Eclipse 内存分析器 Can I run Java garbage collection against a heap dump file? 会这样做:
By default unreachable objects are removed
@Guntram Blohm。正如您所说,OOME 的原因是内存不足或存储管理器无法回收足够的内存。如果您需要长数组来存储碎片内存,则可能根本不执行 GC!
【讨论】: