Full GC 期间的线程转储

Thread Dump during Full GC

我想知道是否有可能在 Full GC 期间获得 线程转储

现在在做什么,

我只是想知道是否有可能在 Full GC 期间获得 Thread Dump

您无法在 GC 期间获取任何详细信息。您现在可以通过 jstat 获取各种堆的大小,但如果您的完整 GC 是一个停止世界收集,则意味着其他一切都已停止。

此外,如果您可以获得此信息,它不太可能是您需要知道的,它只是一个随机样本,因此除非只有一个地方触发 gc,例如调用System.gc(),或者只分配一个地方,用处不大。

如果您想知道 System.gc() 在哪里被触发,您可以使用工具(或修改后的 System class)在明确调用它的地方进行堆栈跟踪.我以前做过这个,发现是 DGC。 https://plumbr.eu/blog/garbage-collection/rmi-enforcing-full-gc-to-run-hourly

如果你想知道最高分配率在哪里,我建议使用内存分析器。这就是工具的用途。它可以向您显示 most/largest 对象创建位置的堆栈跟踪。

使用-XX:+HeapDumpBeforeFullGC。堆转储还应该包含线程堆栈,因为它们是 GC 根。