質問
ThreadMXBeanには、スレッド時間の使用状況を取得するための2つのメソッドがあります:
この2つの違いは何ですか?
更新2 :javadocsにリンクできる場合は、引用しないでください -すでに読んでいます。
更新:これらの時代が何を意味するのかを学ぶために私が使用しようとしたいくつかのコードがありますが、ほとんど成功していません:
ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
threadMXBean.setThreadContentionMonitoringEnabled(true);
long mainThreadId = getMainThreadId(threadMXBean);
logTimes("Start", threadMXBean, mainThreadId);
URL url = new URL("https://hudson.dev.java.net");
URLConnection connection = url.openConnection();
connection.getContent();
logTimes("After loading", threadMXBean, mainThreadId);
そして出力は:
Start Tue Jun 16 16:13:40 EEST 2009 Cpu time : 80, user time: 60, waited: 0, blocked: 0
After loading Tue Jun 16 16:13:43 EEST 2009 Cpu time : 1,020, user time: 960, waited: 0, blocked: 0
したがって、CPU時間とユーザー時間の差は20ミリ秒から60ミリ秒に増加しました。 HttpUrlConnectionを使用するとネットワークI / Oが含まれるからですか?
解決
自分にリンクしたAPIドキュメントが既に指摘しているように
getThreadCpuTime
実装が区別する場合 ユーザーモード時間とシステムモードの間 時間、返されるCPU時間は スレッドが持っている時間 ユーザーモードまたはシステムモードで実行されます。
JVMの実装でユーザーモードとカーネルモードの時間を区別する場合、2つの関数の結果に違いがある可能性があります。
さらに、値はナノ秒まで正確であり、オフセットが>の場合、値にはオーバーフローの問題があります。 2 ^ 63。 JVMは、現在のスレッドのCPU時間の測定もサポートする必要があり、有効にする必要があります。
Win32では、戻り値は GetThreadTimes関数
getThreadUserTime()
-> lpUserTime * 100
//またはこのようなもの
getThreadCpuTime()
-> (lpKernelTime + lpUserTime)* 100
//またはこのようなもの
他のヒント
javadocsで説明されています:-)。
getThreadCpuTime: 指定されたIDのスレッドの合計CPU時間を返します。
getThreadUserTime: 指定されたIDのスレッドがユーザーモードで実行されたCPU時間を返します。
違いは、getThreadCpuTimeにはスレッドがCPUを使用したがユーザーモードではなかった時間も含まれることです。これは、デバイスドライバーの内部にいる、I / Oなどをポーリングしているようなものです。