我正在尝试编写一个程序,该程序使用 JMX 来查找当时 JVM 用于 GC 活动的 CPU 百分比(或一小部分时间,比如 1 秒),类似于 JVisualVM。使用 JMX,我能够找到 lasdt GC 周期开始和结束的时间的 GarbageCollectionTime。但是还没有找到将这些信息转换为 GC 的 CPU 利用率的方法。
3 回答
不幸的是,此信息无法通过 JMX 获得(恕我直言,VisualVM 显示不正确的 GC CPU 时间)。
您可以使用jstat -gc <pid>
为您的 JVM 收集车库收集 CPU 使用情况。
jstat -gc <pid> 1s
会产生这样的东西
S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT
6528.0 6528.0 6523.9 6528.0 52480.0 51600.0 2097152.0 1697279.8 21248.0 5647.8 39 6.873 5 11.685 18.559
6528.0 6528.0 0.0 6528.0 52480.0 13355.5 2097152.0 1794839.9 21248.0 5649.8 41 7.322 5 11.685 19.008
6528.0 6528.0 0.0 6528.0 52480.0 27790.8 2097152.0 1884439.9 21248.0 5649.8 43 7.646 5 11.685 19.332
6528.0 6528.0 0.0 6528.0 52480.0 50942.9 2097152.0 1974055.9 21248.0 5649.8 46 7.969 5 11.685 19.654
- YGCT - CPU 时间是自 JVM 启动以来年轻代收集所消耗的秒数
- FGCT - CPU 时间是自 JVM 启动以来完整收集所消耗的秒数
- GCT - 以上的总和
也许jvmtop可以帮助你(看看GC
专栏)
JvmTop 0.3 alpha (expect bugs) amd64 8 cpus, Linux 2.6.32-27, load avg 0.12
http://code.google.com/p/jvmtop
PID MAIN-CLASS HPCUR HPMAX NHCUR NHMAX CPU GC VM USERNAME #T DL
3370 rapperSimpleApp 165m 455m 109m 176m 0.12% 0.00% S6U37 web 21
11272 ver.resin.Resin [ERROR: Could not attach to VM]
27338 WatchdogManager 11m 28m 23m 130m 0.00% 0.00% S6U37 web 31
19187 m.jvmtop.JvmTop 20m 3544m 13m 130m 0.93% 0.47% S6U37 web 20
16733 artup.Bootstrap 159m 455m 166m 304m 0.12% 0.00% S6U37 web 46
好吧,您将无法以编程方式找到答案。GC 将使用 100% 的可用 CPU。真正的问题是“有多少 CPU 可用?”
串行 GC (
-XX:+UseSerialGC
) 将使用一个CPU。并行收集器 (
-XX:+UseParallelGC
,-XX:+UseParallelOldGC
和-XX:+UseParNewGC
) 将使用您提供的 CPU 数量(-XX:ParallelGCThreads=N
),或者如果您未指定数量则全部使用大多数并发收集器(
-XX:+UseConcMarkSweepGC
和-XX:+UseG1GC
)将使用您提供的 CPU 数量(-XX:ConcGCThreads=N
),如果您未指定数量,则使用其中的一半
请注意,使用 CMS 和 G1,您可以使用以下选项为 GC 设置一些目标:
-XX:MaxGCPauseMillis=X
将以毫秒为单位设置最大暂停时间目标:-XX:GCPauseIntervalMillis=<X>
将设置两个 GC 周期之间的最小间隔目标
来源:http: //jvm-options.tech.xebia.fr/
您可以在此页面上找到解析 iCMS 日志的提示,并在此页面上找到有关 GC 调整的提示。
希望有帮助!