【问题标题】:Definition of GCT (Total garbage collection time)GCT(总垃圾回收时间)的定义
【发布时间】:2019-08-01 15:11:08
【问题描述】:

“总垃圾收集时间”可以通过观察命令打印的GCT列来确定:

jstat -gc <pid>

如文档所述:https://docs.oracle.com/en/java/javase/12/tools/jstat.html

这似乎是自 Java 进程启动以来花费在 GC 上的时间,以秒为单位。

这是每个核心吗?那么,如果一个四核 CPU 被单个 JVM 实例充分利用了 100 秒,并且垃圾回收率为 10%,那么 GCT 会报告 10 还是 40?如果我启用了超线程(即 8 个操作系统内核),那么我应该如何推断 GCT 数字?

我正在使用 OpenJDK12 HotSpot JVM。

【问题讨论】:

    标签: garbage-collection jvm jstat


    【解决方案1】:

    GCT 指标是特定于收集器的。每个 GC 算法都可以为 GCT 定义自己的含义。

    通常是 stop-the-world GC 暂停所花费的总 挂钟时间。特别是对于 G1,OpenJDK 12 中的默认收集器GCT 是 Full GC 暂停 + 并发 GC 周期的 stop-the-world 阶段的总和。

    但是,对于 Shenandoah GC GCT 还包括并发 GC 时间。无论哪种情况,GCT 都是使用绝对(挂钟)计时器测量的,与线程数或 CPU 内核数无关。

    【讨论】:

    • 很好的答案,谢谢!澄清一下,对于 G1 来说,这是否意味着 JVM 可能会在 100 秒中花费 10 秒用于 stop-the-world/完全暂停,另外 85 秒中会在 100 秒中花费在 non-stop-the-world GC 工作上,并且没有办法知道 Java 进程只使用了 100 秒中剩下的 5 秒来运行它的代码?
    • @AndrewParks 这种情况不太可能发生,因为并发 GC 线程的数量仅限于可用内核的一部分。后台垃圾回收不会阻止应用程序线程运行。
    • 如果要测量GC线程和Application线程的实际CPU消耗,我建议async-profiler
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 2019-05-23
    • 2011-12-21
    • 2012-01-28
    • 2013-06-27
    • 2011-11-29
    相关资源
    最近更新 更多