2013-05-01 62 views
0

我开始假设单个核心机器只能运行一个线程。现在我写了一个基于java/spring的junit测试,它生成20个线程,并使用BigDecimal计算大数的阶乘。jvm如何处理运行状态下的许多线程

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

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

回答

0

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

简短答案是“否”。如果在Linux系统上,您可以通过查看扩展的ps输出中列出的克隆进程来确定哪些线程实际工作,但即使如此,我也怀疑您能够获得您需要的分辨率有用。那么你有Hiezenberg问题,如果你足够快的采样,你会显着影响你试图监测的盒子的性能。你可以看看使用每个线程的CPU时间并做出某种确定,尽管CPU时间可能包括上下文切换开销。

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