Full GC 期间的线程转储
Thread Dump during Full GC
我想知道是否有可能在 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 根。
我想知道是否有可能在 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 根。