跟踪Java中的线程负载



当设计具有多个移动部件的应用程序时,可能会因为高负载而达到最大负载,因此可能需要将应用程序的某些部分优先于其他部分。此外,了解应用程序的哪个部分是瓶颈,或者工作最辛苦,可能有助于确定应用程序对高负载的最佳反应。

是否有一种通用的方法来确定Java内部线程的负载?

可以,如果平台支持的话。来自ThreadMXBean文档:

Java虚拟机实现可以支持测量当前线程、任意线程或无线程的CPU时间。

下面是一些示例代码:

package test.thread.load;
import java.lang.management.ManagementFactory;
import java.lang.management.ThreadMXBean;
public class ThreadLoadTest
{
    public static void main(final String[] args)
    {
        final ThreadMXBean bean = ManagementFactory.getThreadMXBean();
        for (final long id : bean.getAllThreadIds())
        {
            System.out.println(bean.getThreadInfo(id).getThreadName()
                                  + ": " + bean.getThreadCpuTime(id));
        }
    }
}

OperatingSystemMXBean的文档可能也很有用。

设计应该清楚地识别不同类型的任务/用例。然后,根据需要,这些任务可以在分离线程或主线程中执行。您可以为不同类型的任务使用不同的线程池。然后在系统上运行不同类型的负载测试,以优化线程池的线程数和相关队列大小。一旦您达到了系统的最佳数字和期望的性能,请继续进行此练习。

希望有帮助!

最新更新