【问题标题】:JVM PrintGCApplicationConcurrentTime and PrintGCApplicationStoppedTime flagsJVM PrintGCApplicationConcurrentTime 和 PrintGCApplicationStoppedTime 标志
【发布时间】:2016-03-07 19:05:58
【问题描述】:

我正在运行一个 Java 程序,我需要了解每个垃圾收集所花费的时间。 我找到了这 2 个 JVM 标志: -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime

但我无法找到有关它的信息。 我想PrintGCApplicationStoppedTime 打印了应用程序在 STW 中的时间,但是我不确定-XX:+PrintGCApplicationConcurrentTime。它是否打印应用程序与收集线程同时执行的时间?

提前致谢。

【问题讨论】:

    标签: garbage-collection jvm jvm-arguments


    【解决方案1】:

    这些标志的名称不是很准确。

    PrintGCApplicationStoppedTime 显示应用程序在安全点停止的时间。大多数情况下,安全点是由垃圾收集的 stop-the-world 阶段引起的,但是,many other reasons exist

    PrintGCApplicationConcurrentTime 是应用程序在不停止的情况下工作的时间,即两个连续安全点之间的时间。

    【讨论】:

    • 使用这两个标志我会得到很多应用程序停止时间和很多应用程序并发时间。鉴于您的解释,我假设所有这些时间的总和将是总执行时间。但是,这个总和给了我Total execution time : 4.48secs Time application ran : 4.47secs Time application was stopped : 0.01secs 并使用命令time 我得到 13.97 秒。我在这里遗漏了一些东西......
    • @franco 在我的实验中Application time + Stopped time 实际上等于实际执行时间。在您的情况下哪个输出是正确的?你确定你总结了所有的结果吗?
    • 是的,你是对的!这是同一时间(我的错)。但我还有一个问题:例如,对于 CMS 或 G1GC 收集器,有线程与收集器线程同时工作。这个时间是应用程序并发时间的一部分,对吗?
    • @franco 是的,由于并发 GC 已耗尽安全点暂停,其时间计入 Application Concurrent Time 内。
    【解决方案2】:

    您使用这些标志来了解您的申请需要多长时间 在垃圾回收之间运行

    最终可以从 GC 日志,但查看该信息的便捷方法是 命令行标志-XX:+PrintGCApplicationStoppedTime-XX:+PrintGCApplicationConcurrentTime

    将这些添加到命令行会产生如下输出:

    Application time: 0.2863875 seconds
    Total time for which application threads were stopped: 0.0225087 seconds
    Application time: 0.1476791 seconds
    Total time for which application threads were stopped: 0.0255697 seconds
    

    应用程序运行(在第一行中报告)大约 287 毫秒,然后 停止了大约 22 毫秒(在第二行中报告)。

    这些标志可以单独使用,也可以一起使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-16
      • 2011-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多