我想知道是否有可能在Full GC期间获得 * 线程转储 *。我现在在做什么,
我只是想知道是否有可能在Full GC期间获得***线程转储***。
4urapxun1#
在GC过程中无法获得任何详细信息,现在可以通过jstat获得各个堆的大小,但如果您的完整GC是一个stop-the-world- collection,则意味着其他所有操作都已停止。另外,如果你能获得这些信息,它不太可能是你需要知道的,它只是一个随机样本,所以除非只有一个地方触发了gc,例如调用System.gc(),或者只有一个地方分配,否则它不会很有用。如果你想知道System.gc()是在哪里被触发的,你可以使用插装(或者修改的System类)在显式调用它的地方做一个堆栈跟踪。如果你想知道哪里的内存分配率最高,我建议你使用内存分析器,这就是这些工具的作用,它可以向你显示在哪里创建了最多/最大的对象。
System
hfsqlsce2#
使用-XX:+HeapDumpBeforeFullGC。堆转储还应该包含线程堆栈,因为它们是GC根。
-XX:+HeapDumpBeforeFullGC
2条答案
按热度按时间4urapxun1#
在GC过程中无法获得任何详细信息,现在可以通过jstat获得各个堆的大小,但如果您的完整GC是一个stop-the-world- collection,则意味着其他所有操作都已停止。
另外,如果你能获得这些信息,它不太可能是你需要知道的,它只是一个随机样本,所以除非只有一个地方触发了gc,例如调用System.gc(),或者只有一个地方分配,否则它不会很有用。
如果你想知道System.gc()是在哪里被触发的,你可以使用插装(或者修改的
System
类)在显式调用它的地方做一个堆栈跟踪。如果你想知道哪里的内存分配率最高,我建议你使用内存分析器,这就是这些工具的作用,它可以向你显示在哪里创建了最多/最大的对象。
hfsqlsce2#
使用
-XX:+HeapDumpBeforeFullGC
。堆转储还应该包含线程堆栈,因为它们是GC根。