McGoverntheory a posé cette question dans Stackoverflow:
Combien de threads une machine virtuelle Java prend-elle au plus? Est-il lié à des développeurs de machines virtuelles? Qu'en est-il du système d'exploitation? Y a-t-il d'autres facteurs?
Réponse d'Eddie:
Cela dépend du processeur que vous utilisez, du système d'exploitation, de ce que font les autres processus, de la version de Java que vous utilisez et d'autres facteurs. J'ai vu un serveur Windows avec plus de 6500 threads avant qu'il ne baisse. Bien sûr, la plupart des fils ne font rien. Une fois qu'il y a près de 6500 threads (en Java) sur une machine, la machine commencera à avoir des problèmes et deviendra instable.
D'après mon expérience, les fils contenus dans le JVM sont positivement corrélés avec les performances de l'ordinateur lui-même.
Bien sûr, vous devez avoir suffisamment de mémoire native et allouer suffisamment de mémoire à Java afin que chaque thread puisse avoir une pile (pile de machine virtuelle) et que vous pouvez faire ce que vous voulez. Toute machine avec un CPU moderne (AMD ou des générations récentes d'Intel) et 1-2g de mémoire (selon le système d'exploitation) peut facilement prendre en charge une machine virtuelle Java avec des milliers de threads.
Si vous avez besoin d'une réponse plus précise, il est préférable de faire un test de stress vous-même.
Réponse de Charlie Martin:
Il existe de nombreux paramètres (peuvent être définis). Pour des machines virtuelles spécifiques, ils auront leurs propres paramètres d'exécution. (Nombre maximum de threads) Dans une certaine mesure, il est déterminé par le système d'exploitation: quel support le système d'exploitation sous-jacent devrait-il fournir aux threads? Quelles restrictions sont imposées? La machine virtuelle utilise-t-elle le thread du système d'exploitation natif, ou le filetage rouge ou le fil vert?
Le soutien fourni par le système d'exploitation est un autre problème. Si vous écrivez un programme Java comme ceci:
La copie de code est la suivante:
classe Dielikeadog {
public static void main (String [] argv) {
pour(;;){
Nouveau thread (new Somerunaable) .start ();
}
}
}
(Ne vous plaignez pas des détails de syntaxe, ce n'est que du début) Alors bien sûr, vous souhaitez obtenir des centaines de fils de course. Cependant, le coût de la création d'un fil est relativement élevé, et les frais généraux de la planification (trop de threads) deviennent proéminents. Il n'est toujours pas certain que ces fils peuvent faire des choses utiles.
Version améliorée
Ok, je ne peux pas attendre! Voici un petit programme de test qui a été légèrement poli:
Copiez le code comme suit: classe publique Dielikeadog {
objet statique privé s = nouveau objet ();
COMENT INT STATIQUE PRIVÉ = 0;
public static void main (String [] argv) {
pour(;;){
nouveau thread (new Runnable () {
public void run () {
synchronisé (s) {
Count + = 1;
System.err.println ("nouveau thread #" + count);
}
pour(;;){
essayer {
Thread.Sleep (1000);
} catch (exception e) {
System.err.println (E);
}
}
}
}).commencer();
}
}
}
Sur le système OS / X 10.5.6 d'Intel, la sortie de Java 5 est la suivante:
La copie de code est la suivante:
Nouveau fil # 2547
Nouveau fil # 2548
Nouveau fil # 2549
Impossible de créer du fil: 5
Nouveau fil # 2550
Exception dans Thread "Main" java.lang.outofMemoryError: Impossible de créer un nouveau fil natif
sur java.lang.thread.start0 (méthode native)
sur java.lang.thread.start (thread.java:592)
à Dielikeadog.main (Dielikeadog.java:6)
Réponse de Benjismith:
Après avoir lu la réponse de Charlie Martin, je me demandais si la taille de la mémoire du tas peut faire une différence dans le nombre de fils créés, puis j'ai été stupéfait par le résultat: sur le système Vista Home Premium SP1, en utilisant JDK 1.6.0_11, Réglez la taille de la mémoire du tas de 2 m à 1024 m pour exécuter le programme de test de Charlie. Par exemple: pour créer une mémoire de tas 2m, les paramètres de machine virtuelle que j'utilise sont: -xms2m -xmx2m.
Voici mes résultats de test:
Copiez le code comme suit: 2 Mo -> 5744 Threads
4 Mo -> 5743 Threads
8 Mo -> 5735 Fil
12 Mo -> 5724 Threads
16 Mo -> 5712 Threads
24 Mo -> 5687 Threads
32 Mo -> 5662 Threads
48 Mo -> 5610 Threads
64 Mo -> 5561 Threads
96 Mo -> 5457 Threads
128 Mo -> 5357 Threads
192 MB -> 5190 Fil
256 Mo -> 5014 Threads
384 Mo -> 4606 Threads
512 Mo -> 4202 Threads
768 Mo -> 3388 Threads
1024 Mo -> 2583 threads
Ainsi, la taille du tas est vraiment importante. Cependant, la taille du tas et le nombre maximal de threads sont inversement proportionnels.
C'est tellement bizarre!
Réponse de Neil Coffey:
Le nombre maximum théorique absolu de threads est l'espace d'adresse utilisateur du processus divisé par la taille de la pile de threads (en réalité, si toute la mémoire est utilisée par la pile de threads, il n'y aura pas de programme qui peut s'exécuter). Par conséquent, en prenant le système Windows 32 bits à titre d'exemple, l'espace d'adresse utilisateur de chaque processus est 2G. . En fait, sur le système XP, j'ai constaté qu'environ 13 000 threads peuvent être démarrés.
Ensuite, je pense que votre question est essentiellement: (a) si vous pouvez gérer efficacement de nombreux threads dans votre code et ne pas les laisser le faire est évidemment stupide (comme: laissez-les sur le même objet objet (b) si le système d'exploitation peut Gérez efficacement ces nombreux fils. Fondamentalement, si la réponse de (a) est "oui", la réponse de la réponse (b) est "oui".
Par coïncidence, vous pouvez définir la taille de la pile de threads dans le constructeur de threads, mais vous n'avez pas besoin de le faire et de ne pas confondre cela avec les paramètres de la machine virtuelle.