Nombre maximal de threads dans une JVM?
Quel est le nombre maximum de threads qui peuvent être conservés par la machine virtuelle Java?
Je n'ai pas l'expliquer dans ma question initiale, mais je suis en train de référence de la JVM et voudrais essayer de voir combien de threads il peut en même temps de maintenir.
La création de threads dans une boucle jusqu'à ce qu'une exception est levée, est une option, mais je voudrais savoir si il y a une meilleure façon de le faire.
Cela dépend beaucoup sur le système d'exploitation sous-jacente
Qui JVM, système d'exploitation, la quantité de mémoire, et dans quelles conditions? Il est difficile de voir comment une telle manière générale, la question va être utile.
Plus que vous pouvez raisonnablement utiliser.
Qui JVM, système d'exploitation, la quantité de mémoire, et dans quelles conditions? Il est difficile de voir comment une telle manière générale, la question va être utile.
Plus que vous pouvez raisonnablement utiliser.
OriginalL'auteur Craig Locke | 2011-10-11
Vous devez vous connecter pour publier un commentaire.
Écrire une boucle qui crée de nouveaux threads jusqu'à ce qu'il explose est l'ultime façon de le savoir. Vous pourriez bien voir les performances se dégradent terriblement avant qu'il meurt.
Je ne sais pas si il y a un paramètre de configuration ou autres limite intégrée dans la JVM sur le dessus de ma tête. Je n'ai jamais couru dans une limite dans la pratique. Bien sûr, tôt ou tard, vous serez à court de mémoire, peut-être une autre ressource.
Je soupçonne qu'il n'y a pas de limite sur le nombre de threads en soi, mais plutôt sur les ressources associées à un thread. Qui est, vous pouvez voir que vous pouvez avoir 10.000 fils si ils sont tous en cours d'exécution juste une petite classe avec quelques octets de données chaque, mais le nombre diminue rapidement lorsqu'ils ont chacun un tableau de 10 millions de chaînes.
OriginalL'auteur Jay
Il y aura des limites imposées par votre système d'exploitation et la configuration du matériel.
Pour augmenter le nombre de threads simultanés vous devriez baisser la valeur par défaut stacksize
java -Xss 64k
.ulimit -a
va vous donner la configuration de la limite, pour l'utilisateur, les processus et la mémoirecat /proc/sys/kernel/pid_max
- un maximum de 32 ko processus.cat /proc/sys/kernel/threads-max
Pour une JVM 1.5, il a été 512ko, selon le Oracle hotspot faq sur les threads et oom elle est maintenant en tant que de 1,6+ un défaut de 320kb pour une jvm 32 bits sous Linux & Windows.
Pour une JVM 64 bits c'est certainement par défaut est 1 million de dollars. Sorte que vous obtenez seulement 1024 threads par gigaoctet de mémoire, si vous respectez les valeurs par défaut.
You can reduce your stack size by running with the -Xss option. For example: java -server -Xss64k
et :64k is the least amount of stack space allowed per thread
-- qui ne fait pas beaucoup de sens puisque la granularité d'allocation peut être différente d'un système à l' : msdn.microsoft.com/en-us/library/windows/desktop/ms686774.aspx mais ... bon ... je suppose que sun/oracle développeurs ne sont pas "bonnes avec WINAPI" 🙂Je ne comprends pas ce que votre point est? Qu'il n'y a aucune certitude sur la taille de la pile dans la JVM sur les systèmes Windows semblait hors de portée pour moi, il est mentionné dans l'oracle des docs comme
Note that on some versions of Windows, the OS may round up thread stack sizes using very coarse granularity.
La possibilité d'utiliser un petit stacksize était inclus dans ma première réponse, avec 64 ko, ce qui semble être typique de la granularité d'allocation du système pour windows conformément à l'article lié par vous.OriginalL'auteur flob
La limite, si elle existe, sera imposée par le système d'exploitation, pas la jvm
primitives
commeint
existent toujours et sont utilisés partout ;). Si l'on voulait écrire un logiciel qui est à l'abri de ces problèmes que l'on aurait à utiliserBigInteger
et autres joyeusetés - absolument partout, même pour les indices de boucle.OriginalL'auteur Maurice Perry
La vraie question devrait être pas le nombre de threads que vous pouvez créer, mais combien de threads de s'exécuter efficacement. Trop de threads et vous causer de la raclée, trop peu et de moins en moins de temps de calcul.
D'abord, la question, combien de temps à vivre est votre fil. Bref vivre threads sont à peine en vaut la chandelle. De gros calculs d'autre part tout à fait logique.
Seconde, la quantité de mémoire chaque thread consommer. Prendre la quantité de mémoire chaque thread demande et divisé par la quantité de mémoire disponible. Vous ne devez pas créer plus de threads que de ce.
Troisièmement, combien de Processeurs disponibles. Vous ne devez pas créer plus de threads que de Processeurs. En effet, il faut tenir compte d'au moins un de moins que le nombre de threads. Sur un ordinateur portable windows avec 4 Processeurs, vous ne devriez jamais avoir plus de 3 filets si l'efficacité du traitement est nécessaire.
Enfin, quel est votre fil. Si il lit et écrit sur un disque dur, alors vous pouvez avoir plus de threads que le nombre de Processeurs, car il faudra attendre le périphérique de répondre. Considérons la méthode suivante au moment de décider le nombre de threads:
OriginalL'auteur ray
Nombre maximal de threads peut également être limité par la JVM de la mise en œuvre et de l'acr être différent d'une machine virtuelle Java à l'autre de la machine virtuelle Java. Par exemple, dans Jikes RVM un tableau est utilisé pour garder les informations à propos des threads (Voir la ligne 54 Jikes RVM Planificateur de code source). Dans ce cas, le nombre maximal de threads ne peuvent pas dépasser la taille maximale d'un tableau en Java, qui est d'environ 2^32. Mais vous êtes plus susceptible de frapper les autres OS de limites ou de limite de matériel avant d'atteindre 2^32 threads.
OriginalL'auteur Always Asking
Maximum limite de thread dépend principalement du matériel, de l'OS et Java taille de la pile.
Le facteur suivant joue un rôle très important pour identifier max limite de thread:-
2^32
pour32-bit
architecture et2^64
pour64-bit
architecture)java -XX:+PrintFlagsFinal -version | grep -iE 'ThreadStackSize'
PID
limite (peut être déterminer par la commande "cat /proc/sys/kernel/pid_max")ulimit -u
Donc max de thread limite MINIMUM de ((processus de l'espace d'adressage virtuel/java taille de la pile), Max
PID
limite, Max limite de processus)par exemple, si Max processus limite est
2048
et c'est le minimum de tous les ci-dessus mentionné trois-facteur processus java ne sera pas en mesure de créer un thread de plus.Pour le vérifier, on peut créer de la simple application java dans lequel il/elle peut créer un thread dans une boucle et de voir combien il peut aller.
Exemple:
Bonjour Alex, Voici un exemple de code que j'ai utilisé pour identifier la limite de:- statique privé de l'Objet de verrouillage = new Object(); private static int compteur = 0; public static void main(String[] _args) { while (true) { new Thread(new Runnable() { public void run() { synchronized (lock) { compteur += 1; Système.err.println("Nouveau thread #" + compteur); } while (true) { try { Thread.sleep(3000); } catch(Exception _e){ _e.printStackTrace(); } } } }).start(); } } }
Inclure votre code dans la réponse comme un fragment de code ou un bloc de code. Votre code est illisible.
OriginalL'auteur Rahul Sharma