【发布时间】:2011-02-26 12:10:55
【问题描述】:
我有一个使用多线程的 Java 大程序。在某些情况下,程序开始 100% 使用我的八核系统的三个核。在正常使用中,程序以 1-2% 使用所有内核。如何找到重载内核的类?
【问题讨论】:
-
一般来说,一个类并没有使你的机器超载,可能是某个特定的方法。
标签: java performance multithreading class
我有一个使用多线程的 Java 大程序。在某些情况下,程序开始 100% 使用我的八核系统的三个核。在正常使用中,程序以 1-2% 使用所有内核。如何找到重载内核的类?
【问题讨论】:
标签: java performance multithreading class
使用与 jdk-1.6.0_10 捆绑的 jvisualvm 等分析器
【讨论】:
(while !done) {}。一个正确编写的线程很少会 100% 完成有意义的工作,通常计算偶尔会被 I/O 或同步阻塞。 -- 一个好的 CPU 使用率图表应该看起来有点波动。
最好的解决方案是使用分析器——它们就是为此而构建的,Java 6 中捆绑了一个很棒的工具。
另一个(远非理想的解决方案)是在调试模式下在 Eclipse IDE(如果您使用的是该 IDE)中运行您的程序。然后,您可以查看正在运行的线程。如果他们中的很多人被暂停,那么没有被暂停的可能是你的罪魁祸首。强制它中断(从工具栏),你可以看到它在哪里。有很多机会您会发现一个清晰的循环或忙于等待。
【讨论】:
使用分析器确定哪些线程正在使用所有 CPU 周期,以及它们正在执行的方法。
【讨论】:
如果您使用的是 Eclipse,则可以使用TPTP profiling tool。
【讨论】:
如果您要使用商业分析器路线,那么我建议您使用Dynatrace。
【讨论】:
尝试进行线程转储(参见 jps、jstack 命令),然后查看执行了哪些方法。
【讨论】:
如果您在 UNIX 或某些版本的 Linux 上使用 Java,请查看 DTrace with Java。
【讨论】: