「Java」スレッドの CPU 時間を取得する
Java のスレッドの CPU 時間を取得するサンプルを書いてみたので、メモ残しておきます。
JVM のスレッドシステムを管理している ThreadMXBean インタフェースで取得できるみたいです。
・ThreadMXBean (Java Platform SE 6)
http://docs.oracle.com/javase/jp/6/api/java/lang/management/ThreadMXBean.html#isCurrentThreadCpuTimeSupported()
今回は Tomcat 上のアプリケーション ( サーブレット ) でやってみました。
doGet メソッド部分だけの抜粋になりますが、以下の感じでいけました。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ThreadMXBean tmb = ManagementFactory.getThreadMXBean(); // JVM が CPU 時間の取得をサポートしているかどうかは以下のメソッドで確認可能 // System.out.println(tmb.isCurrentThreadCpuTimeSupported()); PrintWriter out = response.getWriter(); out.println("<html><body>"); long[] liveThreadID = tmb.getAllThreadIds(); for (long l : liveThreadID) { ThreadInfo ti = tmb.getThreadInfo(l); // System.out.println(ti.getThreadName() + " [" + l + "] " + tmb.getThreadCpuTime(l)); out.println(ti.getThreadName() + " [" + l + "] " + tmb.getThreadCpuTime(l)); out.println("<br>"); } out.println("</body></html>"); }
上記サーブレットに Web ブラウザからアクセスすると、以下のような出力が得られるはずです。
http-bio-8080-exec-3 [21] 0 http-bio-8080-exec-2 [20] 0 http-bio-8080-exec-1 [19] 78000500 ajp-bio-8009-AsyncTimeout [17] 0 ajp-bio-8009-Acceptor-0 [16] 0 http-bio-8080-AsyncTimeout [15] 0 http-bio-8080-Acceptor-0 [14] 0 ContainerBackgroundProcessor[StandardEngine[Catalina]] [13] 0 pool-2-thread-1 [12] 234001500 pool-1-thread-1 [11] 0 GC Daemon [10] 0 Attach Listener [5] 0 Signal Dispatcher [4] 0 Finalizer [3] 0 Reference Handler [2] 0 main [1] 592803800
以上です。
[ 環境情報 ]
Windows 7 SP1
Apache Tomcat 7.0.27
Java SE 6 Update 34