Wie viele Threads kann eine Java VM unterstützen?

Lesezeit: 8 Minuten

Wie viele Threads kann eine Java VM unterstutzen
McGovernTheorie

Wie viele Threads kann eine Java VM unterstützen? Ist das je nach Anbieter unterschiedlich? nach Betriebssystem? andere Faktoren?

Dies hängt von der CPU ab, die Sie verwenden, vom Betriebssystem, davon, was andere Prozesse tun, von der Java-Version, die Sie verwenden, und von anderen Faktoren. Ich habe gesehen, dass ein Windows-Server > 6500 Threads hat, bevor er die Maschine herunterfährt. Die meisten Threads taten natürlich nichts. Sobald die Maschine ungefähr 6500 Threads (in Java) erreichte, begann die gesamte Maschine Probleme zu haben und wurde instabil.

Meine Erfahrung zeigt, dass Java (neuere Versionen) problemlos so viele Threads verbrauchen kann, wie der Computer selbst problemlos hosten kann.

Natürlich müssen Sie über genügend RAM verfügen und Java mit genügend Speicher gestartet haben, um alles zu tun, was die Threads tun, und um einen Stack für jeden Thread zu haben. Jede Maschine mit einer modernen CPU (die neuesten Generationen von AMD oder Intel) und mit 1 – 2 Gig Speicher (je nach Betriebssystem) kann problemlos eine JVM unterstützen Tausende von Fäden.

Wenn Sie eine spezifischere Antwort als diese benötigen, erstellen Sie am besten ein Profil.

Wie viele Threads kann eine Java VM unterstutzen
Charly Martin

Ähm, jede Menge.

Hier gibt es mehrere Parameter. Die spezifische VM, außerdem gibt es normalerweise auch Laufzeitparameter auf der VM. Das hängt etwas vom Betriebssystem ab: Welche Unterstützung bietet das zugrunde liegende Betriebssystem für Threads und welche Einschränkungen legt es ihnen auf? Wenn die VM überhaupt Threads auf Betriebssystemebene verwendet, die gute alte Red-Thread/Green-Thread-Sache.

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 bin bei meiner ersten Tasse Kaffee), dann sollten Sie sicherlich damit rechnen, Hunderte oder Tausende von Threads zum Laufen zu bringen. Aber Erstellen ein Thread ist relativ teuer und der Scheduler-Overhead kann sehr intensiv werden; Es ist unklar, ob Sie diese Threads irgendetwas Nützliches tun lassen könnten.

Aktualisieren

Okay, konnte nicht widerstehen. Hier ist mein kleines Testprogramm, mit ein paar Verschönerungen:

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 auf Intel und Java 6 5 (siehe Kommentare), hier ist, was ich habe

New thread #2547
New thread #2548
New thread #2549
Can't create thread: 5
New thread #2550
Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
        at java.lang.Thread.start0(Native Method)
        at java.lang.Thread.start(Thread.java:592)
        at DieLikeADog.main(DieLikeADog.java:6)

  • Mit wie viel Speicher hast du die JVM gestartet? Das zählt.

    – Edi

    18. April 2009 um 15:53 ​​Uhr

  • Java 6 Update 13, Ubuntu 8.10 32 Bit, 4 GB RAM, Standard-JVM-Einstellungen = 6318 Threads.

    – Steve K

    18. April 2009 um 17:32 Uhr

  • Heh, spielen Sie mit der Thread-Stapelgröße. java -Xss100k erlaubte mir, 19702 Threads in Linux zu erstellen.

    – Steve K

    18. April 2009 um 17:40 Uhr

  • java -Xss50k hat mir ungefähr 32.000 Threads gebracht. Das hat meine 4 GB RAM aber ausgereizt. Ich musste einige laufende Prozesse anhalten, um wieder genügend Speicher auf meinem Rechner zu haben, um einen neuen Prozess zu forken, um Java zu beenden 😉 – gute Zeiten.

    – Steve K

    18. April 2009 um 17:46 Uhr

  • Mit Java 7 unter Windows 7 habe ich gerade 200.000 Threads erstellt, bevor mein System starb. Der Task-Manager zeigte den Prozess mit 8 GB RAM. Ich bin mir nicht sicher, warum es dort aufgehört hat … Ich habe 12 GB RAM auf meinem Computer. Dies kann also eine andere Grenze erreichen.

    – Dobes Vandermeer

    26. März 2012 um 10:35 Uhr

Nachdem ich den Beitrag von Charlie Martin gelesen hatte, war ich neugierig, ob die Heap-Größe einen Unterschied in der Anzahl der Threads macht, die Sie erstellen können, und ich war völlig verblüfft über das Ergebnis.

Unter Verwendung von JDK 1.6.0_11 auf Vista Home Premium SP1 habe ich Charlies Testanwendung mit unterschiedlichen 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:

2 mb --> 5744 threads
4 mb --> 5743 threads
8 mb --> 5735 threads
12 mb --> 5724 threads
16 mb --> 5712 threads
24 mb --> 5687 threads
32 mb --> 5662 threads
48 mb --> 5610 threads
64 mb --> 5561 threads
96 mb --> 5457 threads
128 mb --> 5357 threads
192 mb --> 5190 threads
256 mb --> 5014 threads
384 mb --> 4606 threads
512 mb --> 4202 threads
768 mb --> 3388 threads
1024 mb --> 2583 threads

Also, ja, die Haufengröße spielt definitiv eine Rolle. Aber die Beziehung zwischen Heap-Größe und maximaler Thread-Anzahl ist INVERSE proportional.

Was seltsam ist.

  • würde Sinn machen, wenn JEDER Thread einen Heap dieser Größe erhält.

    – Thorbjørn Ravn Andersen

    18. April 2009 um 18:56 Uhr

  • Achtung: Mein Rechner hat keine 2583 GB RAM. Oder tauschen. Und die JVM weist keinen Thread-lokalen Heap-Speicherplatz zu. Also das kann es nicht sein…

    – benjismith

    18. April 2009 um 20:37 Uhr

  • Die Heap-Größe verringert den für Stacks verfügbaren Adressraum. Adressraum von 256K/Stack ist sinnvoll.

    – Tom Hawtin – Angelleine

    20. April 2009 um 12:00 Uhr

  • Ja, das zeigt dasselbe pequenoperro.blogspot.com/2009/02/less-is-more.html

    – Tobi

    10. Dezember 2010 um 16:43 Uhr

1646311631 93 Wie viele Threads kann eine Java VM unterstutzen
Shekhar

Ich weiß, dass diese Frage ziemlich alt ist, aber ich möchte nur meine Erkenntnisse teilen.

Mein Laptop kann mit Programmen umgehen, die spawnen 25,000 Threads und alle diese Threads schreiben in regelmäßigen Abständen von 2 Sekunden einige Daten in die MySql-Datenbank.

Ich habe dieses Programm mit ausgeführt 10,000 threads zum 30 minutes continuously dann war auch mein System stabil und ich konnte andere normale Operationen wie Browsen, Öffnen, Schließen anderer Programme usw. ausführen.

Mit 25,000 threads System slows down aber es bleibt ansprechbar.

Mit 50,000 threads System stopped responding sofort und ich musste mein System manuell neu starten.

Meine Systemdaten lauten wie folgt:

Processor : Intel core 2 duo 2.13 GHz
RAM : 4GB
OS : Windows 7 Home Premium
JDK Version : 1.6

Vor dem Ausführen setze ich das jvm-Argument -Xmx2048m.

Ich hoffe es hilft.

Die Absolutes theoretisches Maximum ist im Allgemeinen ein Prozess Benutzeradressraum dividiert durch die Thread-Stack-Größe (obwohl in Wirklichkeit Ihr gesamter Speicher für Thread-Stacks reserviert ist, haben Sie kein funktionierendes Programm …).

Unter 32-Bit-Windows beispielsweise, wo jeder Prozess einen Benutzeradressraum von 2 GB hat, was jedem Thread eine Stapelgröße von 128 KB verleiht, würden Sie ein absolutes Maximum von 16384 Threads (= 2 * 1024 * 1024 / 128) erwarten. In der Praxis finde ich, dass ich ungefähr 13.000 unter XP starten kann.

Dann denke ich, dass Sie im Wesentlichen daran interessiert sind, ob (a) Sie mit so vielen Threads in Ihrem Code jonglieren können und keine offensichtlich dummen Dinge tun (z. B. sie alle auf dasselbe Objekt warten lassen und dann NotifyAll() aufrufen …), und (b) ob das Betriebssystem dies kann. Grundsätzlich ist die Antwort auf (b) „Ja“, wenn die Antwort auf (a) auch „Ja“ lautet.

Kannst du übrigens Geben Sie die Stapelgröße im Konstruktor des Threads an; Sie müssen (und sollten es wahrscheinlich auch nicht) dafür mit VM-Parametern herumspielen.

  • Verwenden Sie also ein 64-Bit-Betriebssystem. Wie lange verwenden wir alle schon 64-Bit-Prozessoren?

    – Tom Hawtin – Angelleine

    20. April 2009 um 12:01 Uhr

  • Sicher, ich gebe nur ein Beispiel für eine theoretische vs. praktische Grenze. Wohlgemerkt, es gibt immer noch eine Menge 32-Bit-Rechner (einschließlich Server) da draußen …

    – Neil Coffey

    20. April 2009 um 12:19 Uhr

Wie viele Threads kann eine Java VM unterstutzen
Steve K

Nachdem Sie mit Charlies DieLikeACode-Klasse herumgespielt haben, sieht es so aus, als ob die Größe des Java-Thread-Stacks einen großen Teil davon ausmacht, wie viele Threads Sie erstellen können.

-Xss Java-Thread-Stapelgröße festlegen

Zum Beispiel

java -Xss100k DieLikeADog

Aber Java hat die Testamentsvollstrecker Schnittstelle. Ich würde das verwenden, Sie können Tausende von ausführbaren Aufgaben senden und den Executor diese Aufgaben mit einer festen Anzahl von Threads verarbeiten lassen.

  • Verwenden Sie also ein 64-Bit-Betriebssystem. Wie lange verwenden wir alle schon 64-Bit-Prozessoren?

    – Tom Hawtin – Angelleine

    20. April 2009 um 12:01 Uhr

  • Sicher, ich gebe nur ein Beispiel für eine theoretische vs. praktische Grenze. Wohlgemerkt, es gibt immer noch eine Menge 32-Bit-Rechner (einschließlich Server) da draußen …

    – Neil Coffey

    20. April 2009 um 12:19 Uhr

1646311632 667 Wie viele Threads kann eine Java VM unterstutzen
Ken

Ich erinnere mich, einen Clojure-Vortrag gehört zu haben, in dem er auf einer Messe eine seiner Apps auf einem spezialisierten Computer mit Tausenden von Kernen (9000?) ausführen musste und sie alle luden. Leider finde ich den Link gerade nicht (Hilfe?).

Ausgehend davon kann man mit Sicherheit sagen, dass die Hardware und Ihr Code die einschränkenden Faktoren sind, nicht die JVM.

  • könntest du nochmal schauen? Ich würde es gerne sehen – es klingt interessant und unterstützt, dass funktionale Sprachen einfach über Kerne hinweg zu skalieren sind.

    – Thorbjørn Ravn Andersen

    18. April 2009 um 18:57 Uhr

  • Kannst du dazu einen Link geben? Ich weiß, dass Cliff Click, Jr., der Lead Engineer von Azul Systems, Rich Hickey’s Ant Colony Simulation auf Azuls größtem JCA-System (Azul Vega 3 Series 7300 Model 7380D: AzulSystems.Com/products/compute_appliance_specs.htm ) mit 864 Kernen und 768 GB RAM, und die 700 Ameisen schafften es, 700 Kerne auszureizen. Aber 9000 Kerne, das ist ziemlich beeindruckend. Was war das für eine Maschine?

    – Jörg W Mittag

    18. April 2009 um 22:10 Uhr

  • Ich glaube, es war die “Ants”-Simulation – hier ist ein Link, wo Rich Hickey (Schöpfer von Clojure) darüber spricht – blip.tv/clojure/clojure-concurrency-819147 . Es wurde auf einigen großen Azul-Systemen mit mehr als 800 Kernen durchgeführt, hauptsächlich um zu demonstrieren, wie gut Clojure im Umgang mit Multi-Core-Parallelität ist.

    – Mikera

    18. Juli 2011 um 19:50 Uhr

  • @mikera lins ist abgelaufen.

    – Thorbjørn Ravn Andersen

    30. März 2014 um 15:32 Uhr

923520cookie-checkWie viele Threads kann eine Java VM unterstützen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy