McGoverntheory stellte diese Frage in Stackoverflow:
Wie viele Threads unterstützt eine java virtuelle Maschine höchstens? Ist es mit virtuellen Maschinenentwicklern zusammen? Was ist mit dem Betriebssystem? Gibt es noch andere Faktoren?
Eddies Antwort:
Es hängt von der von Ihnen verwendeten CPU, dem Betriebssystem, den anderen Prozessen, der Version von Java und anderen Faktoren ab. Ich habe einen Windows -Server mit mehr als 6500 Threads gesehen, bevor er nach unten geht. Natürlich tun die meisten Themen nichts. Sobald es fast 6500 Fäden (in Java) auf einer Maschine gibt, hat die Maschine Probleme und wird instabil.
Nach meiner Erfahrung sind die im JVM enthaltenen Themen positiv mit der Leistung des Computers selbst korreliert.
Natürlich müssen Sie über genügend natives Speicher verfügen und Java genügend Speicher zuweisen, damit jeder Thread einen Stapel (virtueller Maschinenstapel) haben und alles tun kann, was Sie wollen. Jede Maschine mit einer modernen CPU (die jüngsten Generationen von AMD oder Intel) und 1-2G-Speicher (je nach Betriebssystem) kann eine java-virtuelle Maschine mit Tausenden von Threads problemlos unterstützen.
Wenn Sie eine genauere Antwort benötigen, ist es am besten, selbst Stresstest durchzuführen.
Charlie Martins Antwort:
Es gibt viele Parameter (können festgelegt werden). Für bestimmte virtuelle Maschinen haben sie ihre eigenen Laufzeitparameter. (Maximale Anzahl von Threads) In gewissem Maße wird es vom Betriebssystem bestimmt: Welche Unterstützung sollte das zugrunde liegende Betriebssystem den Threads leisten? Welche Beschränkungen werden verhängt? Verwendet die virtuelle Maschine den Faden des nativen Betriebssystems oder des roten Fadens oder des grünen Fadens?
Die Unterstützung des Betriebssystems ist ein weiteres Problem. Wenn Sie ein Java -Programm wie dieses schreiben:
Die Codekopie lautet wie folgt:
Klasse Dielikeadog {
public static void main (String [] argv) {
für(;;){
neuer Thread (neuer Somerunaable) .Start ();
}
}
}
(Beschweren Sie sich nicht über Syntaxdetails, dies beginnt gerade.) Dann möchten Sie natürlich Hunderte laufender Threads erhalten. Die Kosten für die Erstellung eines Threads sind jedoch relativ hoch, und der Aufwand der Planung (zu viele Threads) wird jedoch herausragend. Es ist immer noch ungewiss, ob diese Themen nützliche Dinge tun können.
Aktualisierte Version
OK, ich kann es kaum erwarten! Hier ist ein kleines Testprogramm, das leicht poliert wurde:
Kopieren Sie den Code wie folgt: öffentliche Klasse Dielikeadog {
privates statisches Objekt s = neues Objekt ();
private statische int count = 0;
public static void main (String [] argv) {
für(;;){
neuer Thread (neuer Runnable () {
public void run () {
synchronisiert (s) {
zählen += 1;
System.err.println ("neuer Thread #"+count);
}
für(;;){
versuchen {
Thread.sleep (1000);
} catch (Ausnahme e) {
System.err.println (e);
}
}
}
}).Start();
}
}
}
Auf Intels OS/X 10.5.6 -System ist die Ausgabe von Java 5 wie folgt:
Die Codekopie lautet wie folgt:
Neuer Thread Nr. 2547
Neuer Thread Nr. 2548
Neuer Thread Nr. 2549
Thread kann nicht erstellen: 5
Neuer Thread Nr. 2550
Ausnahme im Thread "Haupt" java.lang.outofMemoryError: Kann keinen neuen nativen Thread erstellen
bei java.lang.thread.start0 (native Methode)
bei java.lang.thread.start (thread.java:592)
bei DieliKeadog.main (Dielikeadog.java:6)
Benjismiths Antwort:
Nachdem ich Charlie Martins Antwort gelesen hatte, fragte ich mich, ob die Größe des Heap -Speichers einen Unterschied in der Anzahl der erstellten Threads bewirken kann, und dann war ich vom Ergebnis fassungslos: Auf dem Vista Home Premium SP1 -System mit JDK 1.6.0_11, Stellen Sie die Größe des Heap -Speichers von 2 m auf 1024 m ein, um das Testprogramm von Charlie auszuführen. Zum Beispiel: Um 2 m Heap -Speicher zu erstellen, sind die ich verwende die Parameter der virtuellen Maschine: -xms2m -xmx2m.
Hier sind meine Testergebnisse:
Kopieren Sie den Code wie folgt: 2 MB -> 5744 Threads
4 MB -> 5743 Threads
8 MB -> 5735 Fäden
12 MB -> 5724 Fäden
16 MB -> 5712 Fäden
24 MB -> 5687 Fäden
32 MB -> 5662 Threads
48 MB -> 5610 Fäden
64 MB -> 5561 Fäden
96 MB -> 5457 Fäden
128 MB -> 5357 Fäden
192 MB -> 5190 Fäden
256 MB -> 5014 Fäden
384 MB -> 4606 Threads
512 MB -> 4202 Fäden
768 MB -> 3388 Fäden
1024 MB -> 2583 Fäden
Die Größe des Haufens ist also wirklich wichtig. Die Haufengröße und die maximale Anzahl von Threads sind jedoch umgekehrt proportional.
Das ist so seltsam!
Neil Coffeys Antwort:
Die absolute theoretische maximale Anzahl von Threads ist der Benutzeradressraum des Prozesses geteilt durch die Größe des Thread -Stapels (in Wirklichkeit, wenn der gesamte Speicher vom Thread -Stapel verwendet wird, gibt es kein Programm, das ausgeführt werden kann). Daher beträgt das 32-Bit-Windows-System als Beispiel der Benutzeradressraum jedes Prozesses 2G. . Tatsächlich habe ich auf dem XP -System festgestellt, dass etwa 13.000 Themen gestartet werden können.
Dann denke ich, dass Ihre Frage im Wesentlichen lautet: (a) ob Sie viele Threads in Ihrem Code effektiv verwalten können und sie nicht zulassen, dass sie dies tun, ist offensichtlich dumm (z. B. auf dasselbe Objektobjekt (b), ob das Betriebssystem kann Diese vielen Themen effektiv verwalten. Wenn die Antwort von (a) "Ja" lautet, lautet die Antwort (b) "Ja".
Zufälligerweise können Sie die Thread -Stapelgröße im Thread -Konstruktor einstellen, müssen dies jedoch nicht mit den Parametern der virtuellen Maschine verwechseln.