我想知道在完整GC期间是否可以获得线程转储。
目前正在做什么,
在完整GC期间获取时间戳/日期戳
将其与日志进行比较,并缩小请求或操作 这可能会触发它。
我只是想知道在Full GC期间是否可以获得 线程转储 。
答案 0 :(得分:1)
在GC期间无法获取任何详细信息。您现在可以通过jstat获取各种堆的大小,但如果您的完整GC是一个停止世界的集合,则意味着其他一切都已停止。
此外,如果您可以获得此信息,则不太可能是您需要知道的,它只是一个随机样本,因此除非只有一个地方触发gc,例如对System.gc()的调用,或只有一个地方的分配,它不会那么有用。
如果您想知道System.gc()被触发的位置,您可以使用检测(或修改后的System
类)来显式调用它。我之前做过这件事,发现它是DGC。 https://plumbr.eu/blog/garbage-collection/rmi-enforcing-full-gc-to-run-hourly
如果您想知道最高分配率在哪里,我建议使用内存分析器。这就是工具的用途。它可以显示最大/最大对象创建位置的堆栈跟踪。
答案 1 :(得分:1)
使用-XX:+HeapDumpBeforeFullGC
。堆转储还应包含线程堆栈,因为它们是GC根目录。