awk*_*awk 32 java multithreading cpu-usage
我想问一下是否有一些简单的方法来确定cpu usage
每个线程java
.谢谢
Von*_*onC 21
它使用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);
}
}
Run Code Online (Sandbox Code Playgroud)
dfa*_*dfa 15
通过使用 java.lang.management.ThreadMXBean.如何获取ThreadMXBean:
ThreadMXBean tmxb = ManagementFactory.getThreadMXBean();
Run Code Online (Sandbox Code Playgroud)
然后您可以使用以下命令查询特定线程消耗的程度:
long cpuTime = tmxb.getThreadCpuTime(aThreadID);
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你.
Option_1:代码级别
在您的业务逻辑代码中; 在开始时调用start()API并在finally块中调用stop().这样您将获得CPU时间来执行当前运行的线程的逻辑.然后记录下来.参考.
class CPUTimer
{
private long _startTime = 0l;
public void start ()
{
_startTime = getCpuTimeInMillis();
}
public long stop ()
{
long result = (getCpuTimeInMillis() - _startTime);
_startTime = 0l;
return result;
}
public boolean isRunning ()
{
return _startTime != 0l;
}
/** thread CPU time in milliseconds. */
private long getCpuTimeInMillis ()
{
ThreadMXBean bean = ManagementFactory.getThreadMXBean();
return bean.isCurrentThreadCpuTimeSupported() ? bean.getCurrentThreadCpuTime()/1000000: 0L;
}
}
Run Code Online (Sandbox Code Playgroud)
Option_2:使用插件监控级别(没有jvisualvm支持的AIX IBM框)
如果您认为现在添加代码有延迟,那么您可以选择JConsole并支持插件.我跟着这篇文章.从该文章下载topthreads jar并运行./jconsole -pluginpath topthreads-1.1.jar
Option_3:使用TOP(shift H)+ JSTACK监控级别(支持'Shif + H'的Unix机器)
按照本教程,top命令将提供查找顶级CPU线程(nid)的选项.在jstack输出文件中检查nid.
虽然这取决于平台,但我相信您正在寻找的是 ThreadMXBean:http://java.sun.com/j2se/1.5.0/docs/api/java/lang/management/ThreadMXBean.html。例如,您可以使用 getThreadUserTime 方法来获取您需要的内容。要检查您的平台是否支持 CPU 测量,您可以调用 isThreadCpuTimeSupported() 。
归档时间: |
|
查看次数: |
34209 次 |
最近记录: |