gpt4 book ai didi

java - 如何在 linux 多处理器环境中监控 java 应用程序每个线程的 cpu 使用情况?

转载 作者:行者123 更新时间:2023-11-30 06:00:10 25 4
gpt4 key购买 nike

我在一台有 8 个内核(2 个四核 cpu)的机器上运行 Linux RedHat 5.3 中的多线程 java 应用程序。

我想监控每个线程的 CPU 使用率,最好是相对于它可以获得的最大 CPU 使用率(在一个内核上运行的单个线程应该达到 100% 而不是 12.5%)。

我可以用 jconsole/visualVM 来做吗?还有其他(希望是免费的)工具吗?

约夫

最佳答案

正如 jarnbjo 回答的那样,您可以查询线程管理 JMX Bean 以获取线程的 cpu 和用户时间:

import static org.junit.Assert.assertTrue;

import java.lang.management.ManagementFactory;
import java.lang.management.ThreadInfo;
import java.lang.management.ThreadMXBean;

import org.junit.Test;

public class ThreadStatsTest {

@Test
public void testThreadStats() throws Exception {
ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
assertTrue(threadMXBean.isThreadCpuTimeSupported());
assertTrue(threadMXBean.isCurrentThreadCpuTimeSupported());

threadMXBean.setThreadContentionMonitoringEnabled(true);
threadMXBean.setThreadCpuTimeEnabled(true);
assertTrue(threadMXBean.isThreadCpuTimeEnabled());

ThreadInfo[] threadInfo = threadMXBean.getThreadInfo(threadMXBean.getAllThreadIds());
for (ThreadInfo threadInfo2 : threadInfo) {
long blockedTime = threadInfo2.getBlockedTime();
long waitedTime = threadInfo2.getWaitedTime();
long cpuTime = threadMXBean.getThreadCpuTime(threadInfo2.getThreadId());
long userTime = threadMXBean.getThreadUserTime(threadInfo2.getThreadId());

String msg = String.format(
"%s: %d ns cpu time, %d ns user time, blocked for %d ms, waited %d ms",
threadInfo2.getThreadName(), cpuTime, userTime, blockedTime, waitedTime);
System.out.println(msg);
}
}
}

关于java - 如何在 linux 多处理器环境中监控 java 应用程序每个线程的 cpu 使用情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1680865/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com