我可以设置Java VM可用的线程/ CPU数量吗?

Mar*_*n K 10 java multithreading jvm

我想限制Java VM可用的线程/进程数,类似于设置可用内存的方式.我希望能够指定它只使用1个线程或任意数字.

注意:我无法在代码中设置它,因为我想限制的代码是一个我无法修改源代码的库.因此,它必须是强加于虚拟机级别的硬限制.(或者,如果您可以对应用程序本身施加可以覆盖库的线程限制?)

注意2:这是一个性能测试,用于限制我想要测试的库,以查看当它可以访问不同数量的CPU /线程时它的性能.

谢谢!

mir*_*phd 34

JVM 中的 CPU 限制问题在 Java 10 中得到解决,并从 build 8u191 向后移植到 Java 8:

-XX:ActiveProcessorCount=2
Run Code Online (Sandbox Code Playgroud)


Kha*_*111 7

为了测试这一点,我使用了更高版本的java版本(java版本“14.0.2”2020-07-14)和这个选项:

-XX:ActiveProcessorCount=2
Run Code Online (Sandbox Code Playgroud)

然而,这不会限制 JVM 使用 2 个以上的处理器。如果有的话,它会使用更多。

根据我(文档和实验的理解,这会影响线程池等中线程数量的计算。但不会对分配给进程的 cpu 数量施加任何限制。

限制 cpu 使用的一种方法是在 docker 容器内运行 java 进程并使用

“--cpu”

泊坞窗选项。

这是我特别在 Mac 操作系统上使用的,目前没有支持限制 cpu 的实用程序。

另一种方法是使用操作系统特定的实用程序,例如taskset / isolcpus / cgroups(在 Linux 上可用)。

因此,如果问题是限制 java 进程使用的 cpu,那么ActiveProcessorCount选项本身是没有用的。在 docker 容器内运行它或使用特定于操作系统的包装器来处理 cpu 或其他资源的分配/限制。


Mar*_*n K 0

作为最后的手段,我可​​以在任务管理器中将 Java VM 的关联性设置为仅使用 1 个(或更多)CPU。(当然,这仍然允许在 1 个 CPU 上使用多个线程,但如果没有其他人有更好的想法,这可能是最接近我想要的东西)