完整GC期间的线程转储

时间:2016-07-04 06:40:46

标签: java jvm

我想知道在完整GC期间是否可以获得线程转储

目前正在做什么,

  • 在完整GC期间获取时间戳/日期戳

  • 将其与日志进行比较,并缩小请求操作 这可能会触发它。

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

2 个答案:

答案 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根目录。