我正在尝试编写一个程序,该程序使用JMX来查找JVM在那个时刻(或者一小部分时间,例如1秒)用于GC活动的CPU百分比,类似于JVisualVM。使用JMX我能够在lasdt GC循环开始和结束的时间找到GarbageCollectionTime。但尚未找到将此信息转换为GC的CPU利用率的方法。
答案 0 :(得分:0)
好吧,你将无法以编程方式找到答案。 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
),或者ĥalf如果你没有指定一个数字
请注意,使用CMS和G1,您可以使用以下选项为GC设置一些目标:
-XX:MaxGCPauseMillis=X
将以毫秒为单位设置最长暂停时间目标:
-XX:GCPauseIntervalMillis=<X>
将设置两个GC周期之间的最小间隔目标
来源:http://jvm-options.tech.xebia.fr/
您可以在this page上找到解析iCMS日志的提示,以及this page上有关GC调整的提示。
希望有所帮助!
答案 1 :(得分:0)
不幸的是,这些信息无法通过JMX获得(IMHO 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
答案 2 :(得分:0)
也许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