我想知道是否可以在 Full GC 期间获取线程转储。
现在在做什么,
在完整GC期间获取时间戳/日期戳
将其与日志进行比较并缩小请求或操作的范围 这可能会触发它。
我只是想知道是否有可能在 Full GC 期间获取线程转储。
最佳答案
您无法在 GC 期间获取任何详细信息。现在,您可以通过 jstat 获取各种堆的大小,但如果您的完整 GC 是一个 stop-the-world-collection,则意味着其他一切都已停止。
此外,如果您可以获得此信息,它不太可能是您需要知道的信息,它只是一个随机样本,因此除非只有一个地方触发 gc,例如调用 System.gc(),或者只分配一个位置,它不会那么有用。
如果您想知道 System.gc() 在哪里被触发,您可以使用检测(或修改后的 System 类)在显式调用它的地方进行堆栈跟踪。我以前做过这个,发现是DGC。 https://plumbr.eu/blog/garbage-collection/rmi-enforcing-full-gc-to-run-hourly
如果你想知道最高的分配率在哪里,我建议使用内存分析器。这就是工具的用途。它可以向您显示创建最多/最大对象的堆栈跟踪。
关于java - Full GC 期间的线程转储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38178293/