我有一个java程序,它分配和释放许多对象,我想知道如何获取一些GC信息,例如:
我主要看到3个选项:
1)使用命令-verbose:gc打印样式的行
[GC (Allocation Failure) 131553K->131145K(228864K), 0.1332768 secs]
根据我的理解,表示收集周期为0.1332768秒。
2)使用下面的代码
private static void gcReport() {
int cycles = 0;
long collectionTime = 0;
for (GarbageCollectorMXBean bean:
ManagementFactory.getGarbageCollectorMXBeans()) {
collectionTime += bean.getCollectionTime();
cycles += bean.getCollectionCount();
}
System.out.println("Collection cycles: " + cycles);
System.out.println("Collection time: " + collectionTime + "msec");
}
3)使用像visualVM这样的分析器(我对此选项不感兴趣)。
我可以使用已经选项1和2,我想知道这些选项有多准确。例如,如果我们使用并行收集器(-XX:+ UseParallelOldGC),变量collectionTime是否保留所有线程执行GC所花费的时间总和? 在选项1中,每条带有GC信息的行是否代表1个线程所花费的时间?或者所有线程中的一些平均值(或其他计算值)?
我认为当我们使用具有stop-the-world的顺序GC时,这些是很好的选择,我们可以实际看到程序暂停多长时间。 但是,我不确定它们实际上是否为并行和并发收集器提供了时间开销。他们呢?如果是这样,他们如何计算?
我可以使用并发和并行收集器吗?
感谢。