用Java获取GC时间
我有一个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() {
- 有多少个收集周期
- 做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工具。现在看着它,我觉得它正是我所需要的。