jvm如何处理runnable状态下的许多线程

时间:2013-05-01 19:57:59

标签: java multithreading jvm cpu contention

我首先假设单个核心机器只能运行一个线程。现在我编写了一个基于java / spring的junit测试,它生成了20个线程,并使用BigDecimal计算大数的阶乘。

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

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

1 个答案:

答案 0 :(得分:1)

  

是否有方法或工具可以通过视觉或数字证明所有线程互相干扰并且CPU从一个线程切换到另一个线程?

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

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