2014-06-25 30 views
5

我們想內部化JConsole/JVisualVM的一些功能,並從正在運行的應用程序中收集有關cpu利用率和內存消耗的數據。原因是,安全限制使我們無法在生產系統上將jmx端口打開到外部。如何確定應用程序內的gc-cpu利用率?

大部分所需的數據都可以通過MXBeans進行監控,但是,用於垃圾收集的cputime仍然不見了。通過GarbageCollectorMXBean監測gc時間並不有用,因爲它僅提供並行工作收集器的壁掛時間。

我認爲可以使用ThreadMXBean來確定所有gc線程的cputime。我看不到安全識別這些線程的方法。

有誰知道,JVisualVM如何計算這個數字?

回答

2

前段時間我寫了關於JVM診斷API的總結,它可用here

總之,MBean和「pref計數器」是JVM自我診斷的主要來源。

JVisualVM正在使用GarbageCollectorMXBean將掛鐘時間解釋爲CPU時間(即顯示無意義)。

ThreadMXBean不包括GC線程是線程列表,所以它也是無用的。在SJK工具中,我從進程CPU時間減去了所有應用程序線程的累計CPU時間。這種方法不準確,但總比沒有好。

「Perf計數器」具有有關GC的CPU使用情況的準確信息。可以通過sun.management.counter.perf.PerfInstrumentation訪問「Perf計數器」。

Here您可以找到示例(JUnit測試)轉儲主機JVM的「perf計數器」。

您需要sun.gc.collector.0.timesun.gc.collector.1.time計數器,用於測量年輕人和老人/完全GC的累計CPU使用率(請注意,他們以tick計)。

相關問題