6

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が含まれているためですか?

4

2 に答える 2

9

あなた自身にリンクしたAPIドキュメントがすでに指摘しているように

getThreadCpuTime

実装がユーザー モード時間とシステム モード時間を区別する場合、返される CPU 時間は、スレッドがユーザー モードまたはシステム モードで実行された時間です。

JVM の実装がユーザー モードとカーネル モードの時間を区別する場合、2 つの関数の結果に違いが生じる可能性があります。

さらに、値はナノ秒までしか正確ではなく、オフセットが > 2^63 の場合、値にはオーバーフローの問題があります。JVM は、現在のスレッドの CPU 時間の測定もサポートする必要があり、有効にする必要があります。

Win32 では、戻り値はGetThreadTimes 関数から取得した値と同じである必要があります。

getThreadUserTime()-> lpUserTime * 100//またはこのようなもの

getThreadCpuTime()-> (lpKernelTime + lpUserTime) * 100//またはこのようなもの

ユーザーモードとカーネルモードのより明確な参照

于 2009-06-16T12:49:12.307 に答える
-1

それはjavadocsで説明されています:-)。

getThreadCpuTime: 指定された ID のスレッドの合計 CPU 時間を返します。

getThreadUserTime: 指定された ID のスレッドがユーザー モードで実行された CPU 時間を返します。

違いは、getThreadCpuTime には、スレッドが CPU を使用したが、ユーザー モードではなかった時間も含まれていることです。これは、デバイス ドライバー内にいること、I/O をポーリングすることなどです。

于 2009-06-16T12:50:33.940 に答える