cpu usage
のスレッドごとに決定する簡単な方法があるかどうかを尋ねたいと思いますjava
。ありがとう
6 に答える
JConsole (アーカイブされたリンク) は、プラグインを介してこの種の情報を提供していると思います
ThreadMXBean getThreadCpuTime() 関数を使用します。
次のようなもの:
long upTime = runtimeProxy.getUptime();
List<Long> threadCpuTime = new ArrayList<Long>();
for (int i = 0; i < threadIds.size(); i++) {
long threadId = threadIds.get(i);
if (threadId != -1) {
threadCpuTime.add(threadProxy.getThreadCpuTime(threadId));
} else {
threadCpuTime.add(0L);
}
}
int nCPUs = osProxy.getAvailableProcessors();
List<Float> cpuUsageList = new ArrayList<Float>();
if (prevUpTime > 0L && upTime > prevUpTime) {
// elapsedTime is in ms
long elapsedTime = upTime - prevUpTime;
for (int i = 0; i < threadIds.size(); i++) {
// elapsedCpu is in ns
long elapsedCpu = threadCpuTime.get(i) - prevThreadCpuTime.get(i);
// cpuUsage could go higher than 100% because elapsedTime
// and elapsedCpu are not fetched simultaneously. Limit to
// 99% to avoid Chart showing a scale from 0% to 200%.
float cpuUsage = Math.min(99F, elapsedCpu / (elapsedTime * 1000000F * nCPUs));
cpuUsageList.add(cpuUsage);
}
}
java.lang.management.ThreadMXBeanを使用して 。ThreadMXBean を取得する方法:
ThreadMXBean tmxb = ManagementFactory.getThreadMXBean();
次に、次を使用して、特定のスレッドが消費している量を照会できます。
long cpuTime = tmxb.getThreadCpuTime(aThreadID);
それが役に立てば幸い。
「TopThreads」JConsole プラグインを試してください。http://lsd.luminis.nl/top-threads-plugin-for-jconsole/を参照してください。
これはプラットフォームに依存しますが、探しているのは ThreadMXBean: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/management/ThreadMXBean.htmlだと思います。たとえば、 getThreadUserTime メソッドを使用して、必要なものを取得できます。プラットフォームが CPU 測定をサポートしているかどうかを確認するには、 isThreadCpuTimeSupported() を呼び出します。
実際、オブジェクト ThreadMXBean は必要な機能を提供します (ただし、すべての仮想マシンに実装されているわけではありません)。
JDK 1.5 には、必要なことを正確に実行するデモ プログラムがありました。これはフォルダー demo/management にあり、JTop.java という名前でした。
残念ながら、Java6 にはありません。おそらく、Google で検索するか、JDK5 をダウンロードできます。