Pourquoi ce code Java n'utilise-t-il pas tous les cœurs de processeur?

Le joint simple code Java doit charger tous les processeurs disponibles noyau lors du démarrage avec les bons paramètres. Ainsi, par exemple, vous démarrez avec

java VMTest 8 int 0

et il va commencer à 8 threads qui ne font rien d'autre que de la boucle et en ajoutant 2 un entier. Quelque chose qui fonctionne dans les registres et pas même alloue de la mémoire.

Le problème auquel nous faisons face aujourd'hui est que nous n'obtenons pas un 24 de base de la machine de chargement (AMD 2 prises de courant avec 12 cœurs de chacun), lors de l'exécution de ce programme simple (avec 24 threads bien sûr). Des choses semblables se produisent avec 2 programmes de chaque 12 threads ou les petites machines.

Si nos soupçons, c'est que la JVM (Sun JDK 6u20 sur Linux x64), ne l'est pas.

Quelqu'un a-voir des choses semblables ou a la possibilité d'exécuter et de le signaler si oui ou non il fonctionne bien sur sa machine (>= 8 cœurs seulement s'il vous plaît)? Des idées?

J'ai essayé que sur Amazon EC2 avec 8 cœurs trop, mais la machine virtuelle semble différent d'un véritable boîte, de sorte que le chargement se comporte totalement étrange.

package com.test;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
public class VMTest
{
public class IntTask implements Runnable 
{
@Override
public void run()
{
int i = 0;
while (true)
{
i = i + 2;
}
}
}
public class StringTask implements Runnable 
{
@Override
public void run()
{
int i = 0;
String s;
while (true)
{
i++;
s = "s" + Integer.valueOf(i);
}
}
}
public class ArrayTask implements Runnable 
{
private final int size; 
public ArrayTask(int size)
{
this.size = size;
}
@Override
public void run()
{
int i = 0;
String[] s;
while (true)
{
i++;
s = new String[size];
}
}
}
public void doIt(String[] args) throws InterruptedException
{
final String command = args[1].trim();
ExecutorService executor = Executors.newFixedThreadPool(Integer.valueOf(args[0]));
for (int i = 0; i < Integer.valueOf(args[0]); i++)
{
Runnable runnable = null;
if (command.equalsIgnoreCase("int"))
{
runnable = new IntTask();
}
else if (command.equalsIgnoreCase("string"))
{
runnable = new StringTask();
}
Future<?> submit = executor.submit(runnable);
}
executor.awaitTermination(1, TimeUnit.HOURS);
}
public static void main(String[] args) throws InterruptedException
{
if (args.length < 3)
{
System.err.println("Usage: VMTest threadCount taskDef size");
System.err.println("threadCount: Number 1..n");
System.err.println("taskDef: int string array");
System.err.println("size: size of memory allocation for array, ");
System.exit(-1);
}
new VMTest().doIt(args);
}
}

source d'informationauteur ReneS