Java: Cores available to the JVM?

2019-04-07 18:21发布

问题:

In Java there's the method Runtime.getRuntime().availableProcessors() which has the following Javadoc:

Returns the number of processors available to the Java virtual machine. This value may change during a particular invocation of the virtual machine.

How can the value actually change? Under what circumstances would there be less processors available to the JVM than physically installed for example?

Jonas

回答1:

The Linux command taskset(1) can be used to force processes to use a specific CPU or specific sets of CPUs; it is pretty easy to modify a running program to force it to one or more processors. For example,

taskset -p `pidof java` --cpu-list 0,5,7,9-11


回答2:

In Windows it's possible to change the number of cores an application is allowed to use via some simple properties. In virtualized environments you can also restrict cores to the VM so you only see the cores the VM sees. And in Linux/Unix you can set core affinity so that applications or users can't use all the cores so it's possible that you may have more cores installed than are visible to the JVM.

Note: this is useful for machines running multiple jobs where you don't want high resource contention and you want to underprovision (or even overprovision) resources.



回答3:

On some hardware (servers), it is possible to hotswap processors without rebooting the system. This may cause the number of processors to change. Although a more common cause is when the sysadmin changed the processor scheduling policy.



回答4:

You can customize the resources available to the java applications with options on the java command. I actually don't know the exact name of the switches but you can customize a bunch of stuff.

Why would you give less processors to an instance of the JVM? It depends! maybe you're hosting tomcats and want to distribute resources available to your customers.

Hope this helps.