Die maximale Anzahl von threads in einer JVM?
Was die maximale Anzahl der threads, die beibehalten werden kann von der Java virtual machine?
Ich nicht erklären, das in meiner ursprünglichen Frage, aber ich bin versucht, einen benchmark für die JVM und würde gerne versuchen und sehen, wie viele threads es können gleichzeitig pflegen.
Erstellen von threads in einer Schleife, bis eine exception geworfen wird, ist eine option, jedoch würde ich gerne wissen, ob es einen besseren Weg, dies zu tun.
Es hängt viel von der darunterliegenden Betriebssystem
Die JVM, welches Betriebssystem, wie viel Speicher, und unter welchen Bedingungen? Es ist schwer zu sehen, wie so eine Allgemeine Frage ist, nützlich zu sein.
Mehr als man vernünftigerweise verwenden.
Die JVM, welches Betriebssystem, wie viel Speicher, und unter welchen Bedingungen? Es ist schwer zu sehen, wie so eine Allgemeine Frage ist, nützlich zu sein.
Mehr als man vernünftigerweise verwenden.
InformationsquelleAutor Craig Locke | 2011-10-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schreiben eine Schleife, erstellt neue threads, bis es explodiert ist die definitive Weg, um das herauszufinden. Könnten Sie sehen auch die Leistung verschlechtern, schrecklich, bevor er tatsächlich stirbt.
Ich weiß nicht, ob es irgendeine Konfiguration parameter oder andere built-in-Grenzwerte in der JVM aus der Spitze von meinem Kopf. Ich habe noch nie ein limit in der Praxis. Natürlich wird man früher oder später der Arbeitsspeicher, vielleicht einige andere Ressource.
Ich vermute, dass es keine Begrenzung für die Anzahl der threads per se, sondern auf die Ressourcen, die einem thread zugeordnet. Das heißt, Sie können sehen, dass Sie haben 10.000 threads, wenn alle von Ihnen ausgeführt werden nur eine kleine Klasse mit ein paar bytes an Daten, aber die Zahl sinkt rapide, wenn Sie haben jeweils ein array mit 10 Millionen strings.
InformationsquelleAutor Jay
Gibt es einige Grenzen, die von Ihrem Betriebssystem und die hardware-Konfiguration.
Erhöhen die Anzahl der gleichzeitigen threads sollten Sie senken den Standard-stacksize
java -Xss 64k
.ulimit -a
geben Sie die konfigurierten Grenzwerte für Benutzer, Prozesse und Speichercat /proc/sys/kernel/pid_max
- maximal 32k Prozesse.cat /proc/sys/kernel/threads-max
Für eine 1,5 JVM-es war 512kb, nach der Oracle hotspot-faq auf threads und oom es ist nun als 1,6+ der Standard 320kb für eine 32bit jvm auf Linux & Windows.
Für eine 64-bit-JVM es sicherlich standardmäßig auf 1M. So bekommst du nur 1024 threads pro gigabyte Speicher, wenn Sie-stick auf die Standardwerte zurückgesetzt werden.
You can reduce your stack size by running with the -Xss option. For example: java -server -Xss64k
und :64k is the least amount of stack space allowed per thread
-- was aber nicht viel Sinn, da die Zuweisung Granularität kann Verschieden sein, von system zu system : msdn.microsoft.com/en-us/library/windows/desktop/ms686774.aspx, aber ... hey ... ich denke die sun/oracle-Entwickler nicht "gut mit WINAPI" 🙂Ich verstehe nicht, was Ihr Punkt ist? Dass es keine Gewissheit über die stacksize in der JVM auf Windows-Systemen schien out of scope zu mir, es wird erwähnt in den oracle docs als
Note that on some versions of Windows, the OS may round up thread stack sizes using very coarse granularity.
Die Möglichkeit, einen kleineren stacksize war in meiner ersten Antwort, mit 64kb, die scheint, werden die typischen Systems Zuweisung Granularität für windows nach dem verlinkten Artikel von dir.InformationsquelleAutor flob
Die Grenze, wenn es einer ist, auferlegt werden, die durch das Betriebssystem, nicht die jvm
primitives
wieint
noch immer vorhanden und werden überall verwendet ;). Wenn man wollte, um software zu schreiben, die immun gegen diese Probleme müsste man verwendenBigInteger
und so weiter - absolut überall, auch für loop-Indizes.InformationsquelleAutor Maurice Perry
Die eigentliche Frage sollte nicht sein, wie viele threads ein, die Sie erstellen können, aber wie viele threads effizient laufen. Zu viele threads, und Sie werden zu verdreschen, zu wenige und weniger Rechenzeit.
Erste Frage, wie lange zu Leben, ist dein thread. Kurze live-threads sind kaum der Mühe Wert. Große Berechnungen, die auf der anderen Seite durchaus Sinn machen.
Zweitens, wie viel Speicher jeder thread verbrauchen. Nehmen Sie die Menge an Speicher jeder thread erfordert und geteilt durch die Menge des verfügbaren Speichers. Sie sollten nicht mehr threads als diesen.
Drittens, wie viele CPUs hast du zur Verfügung. Sie sollten nicht mehr threads als CPUs. In der Tat, sollten Sie mindestens eins kleiner als die Anzahl von threads. Auf einem windows-laptop mit 4 CPUs, sollten Sie nie mehr als 3 Threads, wenn effiziente Bearbeitung erforderlich ist.
Schließlich nicht, was der thread tun. Wenn er liest und schreibt auf eine Festplatte, dann kannst du mehr threads als die Anzahl der CPUs, da wird es haben, zu warten, bis das Gerät reagiert. Betrachten Sie die folgende Methode, wenn die Entscheidung, die Anzahl der threads:
InformationsquelleAutor ray
Maximale Anzahl der threads kann auch begrenzt werden, indem die JVM-Implementierung und cab anders sein, aus einer Java virtuellen Maschine zur anderen virtuellen Java-Maschine. Zum Beispiel, in Jikes RVM ein array wird verwendet, um Informationen über die threads (Siehe Zeile 54 in der Jikes RVM Scheduler source code). In diesem Fall wird die maximale Anzahl der threads, die nicht mehr als die maximale Größe eines Arrays in Java, die über 2^32. Aber Sie sind eher zu trifft andere OS Grenzwerte oder hardware-Grenzen vor erreichen 2^32 threads.
InformationsquelleAutor Always Asking
Maximale thread-limit-richtet sich vor allem auf hardware -, Betriebssystem-und Java-stack-Größe.
Den folgenden Faktor spielt eine sehr wichtige Rolle zu identifizieren, max-thread-limit:-
2^32
für32-bit
Architektur und2^64
für64-bit
Architektur)java -XX:+PrintFlagsFinal -version | grep -iE 'ThreadStackSize'
PID
limit (kann ermittelt werden mit dem Befehl "cat /proc/sys/kernel/pid_max")ulimit -u
Also max thread-Grenze wird MINDESTENS ((process-virtueller Adressraum/java-stack-Größe), Max
PID
limit, Max-Prozess-limit)z.B. wenn Max Prozess-limit ist
2048
und es ist mindestens alle oben erwähnen drei-Faktor dann der java-Prozess wird nicht in der Lage sein zu erstellen, ein thread mehr als das.Überprüfen können Sie erstellen einfache java-Anwendung, in der er/Sie kann einen thread erstellst in einer Schleife und sehen, wie viel es gehen kann.
Beispiel:
Hallo Alex, Hier ist ein Beispiel-code, die ich verwendet, um zu identifizieren der Grenze: private static Object lock = new Object(); private static int counter = 0; public static void main(String[] _args) { while (true) { new Thread(new Runnable() { public void run() { synchronized (lock) { counter += 1; System.err.println("Neuer thread #" + counter); } while (true) { try { Thread.sleep(3000); } catch(Exception _e){ _e.printStackTrace(); } } } }).start(); } } }
Umfassen Sie Ihren code in die Antwort, wie ein code-snippet oder den code-block. Dein code ist unlesbar.
InformationsquelleAutor Rahul Sharma