0

我开始假设单核机器只能运行一个线程。现在我编写了一个基于 java/spring 的 junit 测试,它产生 20 个线程,它们使用 BigDecimal 计算大量的阶乘。

我用 Visual VM 监视了那个 junit,我可以看到所有 20 个线程都在工作,并且在 Visual VM 中显示为正在运行(绿色)。据我了解,jvm 使它们看起来好像都在运行,但在非常精细的级别上,每个线程都将轮流占用 CPU 周期。有没有一种方法或工具可以直观地或通过数字证明所有线程确实相互干扰并且 CPU 从一个线程切换到另一个线程?或者换句话说,我想查看给定数量的执行给定功能的线程,由于 CPU 的极端上下文切换,饱和点或收益递减是多少。

我需要解决的实际问题是在大型 Java 应用程序中调整线程。如果我在示例运行中看不到线程争用,那么我也将无法在大型应用程序中看到线程争用/滥用。

4

1 回答 1

1

有没有一种方法或工具可以直观地或通过数字证明所有线程确实相互干扰并且 CPU 从一个线程切换到另一个线程?

最简洁的答案是不”。如果在 Linux 系统上,您可以通过查看扩展输出中列出的克隆进程来确定哪些线程实际上正在工作,ps但即便如此,我怀疑您是否能够获得使该信息有用所需的分辨率. 然后你会遇到 Hiezenberg 问题,如果你的采样速度足够快,你会极大地影响你试图监控的盒子的性能。您可以查看每个线程使用的 CPU 时间并做出某种确定,尽管该 CPU 时间可能包括上下文切换开销。

如果您想弄清楚应用程序的最佳线程数是多少,那么我建议您进行多次测试运行以确定不同线程池大小的最佳吞吐量。当然,如果你切换架构,你将不得不重新运行测试,因为它非常依赖于 CPU、内核、内存等。

于 2013-05-01T20:03:03.807 回答