用Java获取GC时间

时间:2015-09-17 00:18:27

标签: java garbage-collection

我有一个java程序,它分配和释放许多对象,我想知道如何获取一些GC信息,例如:

  • 收集周期数和
  • 用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时,这些是很好的选择,我们可以实际看到程序暂停多长时间。 但是,我不确定它们实际上是否为并行和并发收集器提供了时间开销。他们呢?如果是这样,他们如何计算?

我可以使用并发和并行收集器吗?

感谢。

0 个答案:

没有答案