【问题标题】:How to calculate throughput with Jconsole如何使用 Jconsole 计算吞吐量
【发布时间】:2017-09-19 13:26:54
【问题描述】:

有没有办法使用 JConsole 接口计算 Java 程序给定时间段的垃圾收集吞吐量?例如,我想比较程序中的不同功能以及 GC 吞吐量在这些功能之间的差异。

我已阅读 Oracle JConsole 文档,我能找到的最接近的指标是 GC Time,即:

“GC时间:垃圾收集的累计时间和调用的总次数。它可能有多行,每一行代表Java VM中使用的一种垃圾收集算法。”

来源:https://docs.oracle.com/javase/8/docs/technotes/guides/management/jconsole.html

但这并没有指定开始累积的开始时间。如果我能确定什么时候开始,我就可以自己计算吞吐量。

或者还有其他方法可以计算 JConsole 的吞吐量吗?

【问题讨论】:

  • gcviewer 可以根据 GC 日志为您计算吞吐量。或者,您可以通过从 mxbeans 获取原始数据自行计算
  • 太好了,谢谢,我不知道这个工具!看起来正是我需要的。 @the8472

标签: java garbage-collection jconsole throughput


【解决方案1】:

我通常使用两个:

  1. GCViewer
  2. gceasy

同时,因为不同的工具可能会显示不同的结果。

对于您的问题,答案是 - 从应用程序开始就启用了 GC 日志。所以当你看到 GC 时间时,你可以得到吞吐量 = sum(GC time)/Total time。

启用 GC 日志是指使用 -verbose:gc 还是 -Xloggc: ?

不,我的意思是内部counters。澄清一下就好了。

另外:你知道 GC 时间代表什么:从应用程序启动开始的时间,或者每个给定时间段的时间?

从申请开始。另一种使用jstat 来查看GC 时间的方法。让我们有这个程序:

public class JStatTest {

    public static void main(String[] args) throws Exception {
        for (int i = 0; i < 10; ++i) {
            System.gc();
            System.out.println("Wait...");
            Thread.sleep(1000);
        }
        Thread.sleep(100_000);
    }

}

我们可以连接 jstat(从开始)和 jconsole(接近结束,循环之后)并看到这个:

这没有启用 GC 详细日志记录。

查看总时间:

【讨论】:

  • 启用 GC 日志是指使用 -verbose:gc 还是 -Xloggc: ?如果是这样,那么您是否必须汇总打印到命令行或文件的结果日志?另外:你知道GC时间代表什么:从应用程序启动开始的时间,或者每个给定时间段的时间?
  • 谢谢@egorlitvinenko 这真的很有帮助!遗憾的是 JConsole 没有记录应用程序的总运行时间,但我可以从命令行输出中得到它。
  • 太棒了!再次感谢,这非常有用!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-25
  • 2019-06-03
  • 2011-03-05
  • 2015-10-25
  • 2012-11-22
  • 1970-01-01
  • 2018-02-13
相关资源
最近更新 更多