Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Java获取GC时间_Java_Garbage Collection - Fatal编程技术网

用Java获取GC时间

用Java获取GC时间,java,garbage-collection,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() {

我有一个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信息的行是否表示一个线程花费的时间?还是所有线程中的某个平均值(或其他计算)

我认为,当我们使用带有stop the world的顺序GC时,这些都是很好的选择,在这里我们可以看到程序暂停了多长时间。 然而,我不确定它们是否真的给出了并行和并发收集器的时间开销。是吗?如果是,如何计算

对于并发收集器和并行收集器,我还可以使用其他选项吗


谢谢。

对于选项1:如果您想要gc阶段的额外细分,您可能需要使用
-XX:+PrintGCDetails
而不是
-verbose:gc
。还提供了将GC输出分解为更多细节的附加选项,但这些选项相当详细。至于对日志输出的基本理解,有一些oracle博客文章对此进行了解释,例如也可以帮助他们比visualvmHi更好地可视化我非常感谢,我不知道GCViewer工具。现在看着它,我觉得它正是我所需要的。