Wie viele Threads kann eine Java VM unterstützen? Variiert dies je nach Anbieter? nach Betriebssystem? andere Faktoren?
quelle
Wie viele Threads kann eine Java VM unterstützen? Variiert dies je nach Anbieter? nach Betriebssystem? andere Faktoren?
Dies hängt von der verwendeten CPU, dem Betriebssystem, den anderen Prozessen, der von Ihnen verwendeten Java-Version und anderen Faktoren ab. Ich habe gesehen, dass ein Windows-Server> 6500 Threads hat, bevor der Computer heruntergefahren wurde. Die meisten Threads machten natürlich nichts. Sobald die Maschine ungefähr 6500 Threads (in Java) erreichte, bekam die gesamte Maschine Probleme und wurde instabil.
Meine Erfahrung zeigt, dass Java (neuere Versionen) problemlos so viele Threads verwenden kann, wie der Computer selbst problemlos hosten kann.
Natürlich muss man über genügend RAM verfügen und Java mit genügend Arbeitsspeicher gestartet haben, um alles zu tun, was die Threads tun, und um einen Stapel für jeden Thread zu haben. Jeder Computer mit einer modernen CPU (die letzten AMD- oder Intel-Generationen) und 1 bis 2 Gig Arbeitsspeicher (je nach Betriebssystem) kann problemlos eine JVM mit Tausenden von Threads unterstützen.
Wenn Sie eine genauere Antwort benötigen, ist es am besten, ein Profil zu erstellen.
Ähm, viele.
Hier gibt es mehrere Parameter. Die spezifische VM sowie normalerweise gibt es auch Laufzeitparameter auf der VM. Das hängt etwas vom Betriebssystem ab: Welche Unterstützung hat das zugrunde liegende Betriebssystem für Threads und welche Einschränkungen werden ihnen auferlegt? Wenn die VM tatsächlich Threads auf Betriebssystemebene verwendet, ist das gute alte rote / grüne Thread-Ding.
Was "Unterstützung" bedeutet, ist eine andere Frage. Wenn Sie ein Java-Programm schreiben, ist das nur so etwas wie
class DieLikeADog {
public static void main(String[] argv){
for(;;){
new Thread(new SomeRunaable).start();
}
}
}
(und beschweren Sie sich nicht über kleine Syntaxdetails, ich trinke meine erste Tasse Kaffee) Dann sollten Sie auf jeden Fall damit rechnen, dass Hunderte oder Tausende von Threads ausgeführt werden. Das Erstellen eines Threads ist jedoch relativ teuer, und der Overhead des Schedulers kann sehr hoch werden. Es ist unklar, ob diese Threads irgendetwas Nützliches tun könnten.
Okay, konnte nicht widerstehen. Hier ist mein kleines Testprogramm mit ein paar Verzierungen:
public class DieLikeADog {
private static Object s = new Object();
private static int count = 0;
public static void main(String[] argv){
for(;;){
new Thread(new Runnable(){
public void run(){
synchronized(s){
count += 1;
System.err.println("New thread #"+count);
}
for(;;){
try {
Thread.sleep(1000);
} catch (Exception e){
System.err.println(e);
}
}
}
}).start();
}
}
}
Unter OS / X 10.5.6 unter Intel und Java 6 5 (siehe Kommentare) habe ich Folgendes erhalten
Neuer Thread # 2547 Neuer Thread # 2548 Neuer Thread # 2549 Thread kann nicht erstellt werden: 5 Neuer Thread # 2550 Ausnahme im Thread "main" java.lang.OutOfMemoryError: Neuer nativer Thread kann nicht erstellt werden at java.lang.Thread.start0 (native Methode) bei java.lang.Thread.start (Thread.java:592) bei DieLikeADog.main (DieLikeADog.java:6)
Nachdem ich Charlie Martins Beitrag gelesen hatte, war ich neugierig, ob die Größe des Heapspeichers einen Unterschied in der Anzahl der Threads macht, die Sie erstellen können, und ich war völlig verblüfft über das Ergebnis.
Mit JDK 1.6.0_11 unter Vista Home Premium SP1 habe ich Charlies Testanwendung mit verschiedenen Heap-Größen zwischen 2 MB und 1024 MB ausgeführt.
Um beispielsweise einen 2-MB-Heap zu erstellen, würde ich die JVM mit den Argumenten -Xms2m -Xmx2m aufrufen.
Hier sind meine Ergebnisse:
Also, ja, die Größe des Haufens ist definitiv wichtig. Die Beziehung zwischen der Größe des Heapspeichers und der maximalen Threadanzahl ist jedoch umgekehrt proportional.
Welches ist komisch.
quelle
Ich weiß, dass diese Frage ziemlich alt ist, möchte aber nur meine Erkenntnisse teilen.
Mein Laptop kann Programme verarbeiten, die
25,000
Threads erzeugen, und alle diese Threads schreiben im regelmäßigen Abstand von 2 Sekunden einige Daten in die MySQL-Datenbank.Ich habe dieses Programm ausgeführt,
10,000 threads
denn30 minutes continuously
dann war auch mein System stabil und ich konnte andere normale Vorgänge ausführen, wie z. B. Surfen, Öffnen, Schließen anderer Programme usw.Mit
25,000 threads
Systemslows down
bleibt es aber reaktionsschnell.Mit
50,000 threads
Systemstopped responding
sofort und ich musste mein System manuell neu starten.Meine Systemdetails lauten wie folgt:
Vor dem Ausführen habe ich das Argument jvm gesetzt
-Xmx2048m
.Ich hoffe es hilft.
quelle
Das absolute theoretische Maximum ist im Allgemeinen der Benutzeradressraum eines Prozesses geteilt durch die Thread-Stapelgröße (obwohl in Wirklichkeit kein Arbeitsprogramm vorhanden ist, wenn Ihr gesamter Speicher für Thread-Stapel reserviert ist ...).
Unter 32-Bit-Windows beispielsweise, bei dem jeder Prozess einen Benutzeradressraum von 2 GB hat, wodurch jeder Thread eine Stapelgröße von 128 KB erhält, erwarten Sie ein absolutes Maximum von 16384 Threads (= 2 * 1024 * 1024/128). In der Praxis kann ich unter XP ungefähr 13.000 starten.
Dann denke ich, dass es Ihnen im Wesentlichen darum geht, ob (a) Sie es schaffen, so viele Threads in Ihrem Code zu jonglieren und nicht offensichtlich dumme Dinge zu tun (z. B. alle auf dasselbe Objekt warten zu lassen und dann notifyAll () aufzurufen ...). und (b) ob das Betriebssystem dies kann. Im Prinzip lautet die Antwort auf (b) "Ja", wenn die Antwort auf (a) auch "Ja" lautet.
Im Übrigen können Sie die Stapelgröße im Konstruktor des Threads angeben ; Sie müssen (und sollten wahrscheinlich nicht) mit VM-Parametern herumspielen.
quelle
Ich erinnere mich an einen Clojure-Vortrag, in dem er eine seiner Apps auf einem speziellen Computer auf einer Messe mit Tausenden von Kernen (9000?) Ausführen durfte, auf der alle geladen wurden. Leider kann ich den Link momentan nicht finden (Hilfe?).
Aufgrund dessen kann man mit Sicherheit sagen, dass die Hardware und Ihr Code die begrenzenden Faktoren sind, nicht die JVM.
quelle
Nach dem Herumspielen mit Charlies DieLikeACode-Klasse sieht es so aus, als ob die Größe des Java-Thread-Stacks einen großen Teil der Anzahl der Threads ausmacht, die Sie erstellen können.
Beispielsweise
Java hat jedoch die Executor- Oberfläche. Ich würde das verwenden, Sie können Tausende von ausführbaren Aufgaben einreichen und den Executor diese Aufgaben mit einer festen Anzahl von Threads verarbeiten lassen.
quelle
Runnable
/Callable
tatsächlich kontinuierlich laufen muss, wie wenn es die Kommunikation handhaben muss. Aber es ist perfekt für SQL-Abfragen.Zumindest unter Mac OS X 10.6 32bit gibt es eine Begrenzung (2560) durch das Betriebssystem. Überprüfen Sie diesen Stackoverflow-Thread .
quelle
Die maximale Anzahl von Threads hängt von folgenden Faktoren ab:
quelle
Zusätzliche Informationen für moderne (systemd) Linux-Systeme.
Es gibt viele Ressourcen zu diesen Werten, die möglicherweise angepasst werden müssen (z. B. Erhöhen der maximalen Anzahl von JVM-Threads (Linux 64-Bit) ). Es wird jedoch ein neues Limit über das systemd "TasksMax" -Limit festgelegt, das pids.max für die cgroup festlegt.
Für Anmeldesitzungen beträgt der UserTasksMax- Standardwert 33% des Kernel-Limits pids_max (normalerweise 12.288) und kann in /etc/systemd/logind.conf überschrieben werden.
Für Dienste beträgt der DefaultTasksMax- Standard 15% des Kernel-Limits pids_max (normalerweise 4.915). Sie können es für den Dienst überschreiben, indem Sie TasksMax in "systemctl edit" festlegen oder DefaultTasksMax in /etc/systemd/system.conf aktualisieren
quelle
Jahr 2017 ... DieLikeADog Klasse.
Neuer Thread # 92459 Ausnahme im Thread "main" java.lang.OutOfMemoryError: Neuer nativer Thread kann nicht erstellt werden
i7-7700 16 GB RAM
quelle
Sie können beliebig viele Threads verarbeiten. es gibt keine Grenzen. Ich habe den folgenden Code ausgeführt, während ich einen Film angesehen und NetBeans verwendet habe, und er hat ordnungsgemäß funktioniert / ohne den Computer anzuhalten. Ich denke, Sie können noch mehr Threads behalten als dieses Programm.
quelle
main
wird jedoch einOutOfMemoryError
auf meinen Computer geworfen , der besagt, dass keine Threads mehr erstellt werden können. Vielleicht @AnilPal, das hast du nicht bemerkt. Ich schlage vor, eine weitere print-Anweisung in diemain(..)
Methode aufzunehmen, um klar zu sehen, wann nach dem Auslösen des Fehlers keine neuen Threads mehr erstellt werden.