Wie nutzt Java mehrere Kerne?

74

Eine JVM wird in einem einzelnen Prozess ausgeführt, und Threads in einer JVM teilen sich den zu diesem Prozess gehörenden Heap. Wie nutzt JVM dann mehrere Kerne, die mehrere Betriebssystem-Threads für eine hohe Parallelität bereitstellen?

Munish Sodhi
quelle
4
Soweit mir bekannt ist, sind Java-Threads native Betriebssystem-Threads (in den meisten JVMs). Nichts Besonderes an ihnen.
Sasha Chedygov
4
Native Anwendungsthreads werden auch in einem einzigen Prozess ausgeführt und teilen sich eine gemeinsame Speicherzuordnung (und können weiterhin mehrere Kerne verwenden).
Thilo

Antworten:

34

Sie können mehrere Kerne mit mehreren Threads verwenden. Die Verwendung einer höheren Anzahl von Threads als der Anzahl der in einer Maschine vorhandenen Kerne kann jedoch einfach eine Verschwendung von Ressourcen sein. Sie können availableProcessors () verwenden , um die Anzahl der Kerne abzurufen.

In Java 7 gibt es ein Fork / Join-Framework , um mehrere Kerne zu verwenden.

Verwandte Fragen:

Emil
quelle
5
Maschinen haben normalerweise nur 2 oder 4 Prozessoren. Sie haben angegeben, dass "die Verwendung einer höheren Anzahl von Threads als die Anzahl der in einer Maschine vorhandenen Kerne einfach eine Verschwendung von Ressourcen sein kann". Bedeutet dies, dass wir nur etwa 2 oder 4 Threads haben sollten, um die Leistung zu maximieren?
Pacerier
2
"Die Verwendung einer höheren Anzahl von Threads als der Anzahl der in einer Maschine vorhandenen Kerne kann jedoch einfach eine Verschwendung von Ressourcen sein." Das macht im allgemeinen Fall nicht viel Sinn. Wenn Sie mehr Threads als die Anzahl der Kerne haben, werden die Threads auf diese Kerne verteilt und erhalten ihren Anteil am angegebenen Kern, genau wie bei jedem anderen laufenden Thread / Prozess, wodurch Fortschritte erzielt werden können, die definitiv effizienter sind als die nacheinander arbeiten.
ChiefTwoPencils
@ ChiefTwoPencils; Wenn wir zwei Anwendungen haben und jede Anwendung 6 Threads hat, die auf 4 CPU-Kernen ausgeführt werden. In diesem Fall, wie werden die Aufgaben auf diese CPUs verteilt? Eine andere Frage in einer einzelnen Anwendung 6 Threads werden auf 4 CPUs ausgeführt. Alle 6 Threads werden parallel auf diesen 4 CPUs ausgeführt oder Interleaving-Vorgänge auf Threads ausgeführt
user3094331
Stimmt es, dass Webanwendungen automatisch von mehreren Kernen profitieren, wenn Sie eine Webanwendung unter Tomcat ausführen (z. B. unter Java 8), bei der jede eingehende HTTP-Anforderung von einem Java-Thread verarbeitet wird? Heute können Sie 32-Kern-AMD-Maschinen mieten, die für mich perfekt klingen, um eine Web-App auszuführen. Sicher: Cloud ist eine weitere Option, aber ich spreche jetzt über dedizierte Server ... Irgendwelche Kommentare?
BasZero
23

Eine JVM wird in einem einzelnen Prozess ausgeführt, und Threads in einer JVM teilen sich den zu diesem Prozess gehörenden Heap. Wie nutzt JVM dann mehrere Kerne, die mehrere Betriebssystem-Threads für eine hohe Parallelität bereitstellen?

Java verwendet die Threads des zugrunde liegenden Betriebssystems, um den Code auf verschiedenen CPUs auszuführen, wenn es auf einem Computer mit mehreren CPUs ausgeführt wird. Wenn jeder Java - Thread gestartet wird, ist es ein zugehöriges OS Thread erstellt und das Betriebssystem für die Planung verantwortlich, etc .. Die JVM bestimmte einige Management tut und der Faden und Java Sprachkonstrukte Tracking wie volatile, synchronized, notify(), wait()etc. beeinflussen die ganze Lauf Status des Betriebssystem-Threads.

Eine JVM wird in einem einzelnen Prozess ausgeführt, und Threads in einer JVM teilen sich den zu diesem Prozess gehörenden Heap.

JVM muss nicht "in einem einzigen Prozess ausgeführt" werden, da selbst der Garbage Collector und anderer JVM-Code in unterschiedlichen Threads ausgeführt werden und das Betriebssystem diese unterschiedlichen Threads häufig als unterschiedliche Prozesse darstellt. Unter Linux beispielsweise maskiert der einzelne Prozess, den Sie in der Prozessliste sehen, häufig eine Reihe verschiedener Thread-Prozesse. Dies gilt auch dann, wenn Sie sich auf einem Single-Core-Computer befinden.

Sie haben jedoch Recht, dass sich alle denselben Heap-Speicherplatz teilen. Sie teilen sich tatsächlich denselben gesamten Speicherplatz, dh Code, internierte Zeichenfolgen, Stapelspeicher usw.

Wie nutzt JVM dann mehrere Kerne, die mehrere Betriebssystem-Threads für eine hohe Parallelität bereitstellen?

Threads erhalten ihre Leistungsverbesserungen aus mehreren Gründen. Offensichtlich führt eine direkte Parallelität häufig dazu, dass das Programm schneller ausgeführt wird. Die gleichzeitige Ausführung mehrerer CPU-Aufgaben kann (wenn auch nicht immer) den Durchsatz der Anwendung verbessern. Sie können E / A-Vorgänge auch auf einen einzelnen Thread beschränken, sodass andere Threads ausgeführt werden können, während ein Thread auf E / A wartet (Lesen / Schreiben auf Festplatte / Netzwerk usw.).

In Bezug auf den Arbeitsspeicher erhalten Threads jedoch aufgrund des lokalen zwischengespeicherten Arbeitsspeichers pro CPU viele Leistungsverbesserungen. Wenn ein Thread auf einer CPU ausgeführt wird, hilft der lokale Hochgeschwindigkeitsspeicher-Cache für die CPU dem Thread, Speicheranforderungen lokal zu isolieren, ohne die Zeit zum Lesen oder Schreiben in den zentralen Speicher aufwenden zu müssen. Aus diesem Grund volatileund synchronizedAnrufe umfassen Konstrukten Speicher Synchronisation , da der Cache - Speicher in den Hauptspeicher werden gespült hat oder für ungültig erklärt , wenn Threads müssen ihre Arbeit oder miteinander in Verbindung koordinieren.

Grau
quelle
Vielen Dank für diese Antwort - aber ich habe eine Anfrage: Es wäre sehr hilfreich, wenn Sie vor jeder Verwendung des Wortes "Thread" "OS" oder "Java" voranstellen könnten. Das Aufeinandertreffen der Begriffe ist für mich furchtbar verwirrend (und ich würde auch einige andere erraten) und ich würde lügen, wenn ich sagen würde, dass ich das Ganze jetzt wirklich verstehe.
Niki Herl
1
Der springende Punkt hier @NikiHerl ist, dass die Java-Threads Betriebssystem-Thread-Äquivalente haben. Wenn ich den Thread-Typ nicht spezifiziere, spielt es keine Rolle. Wenn ich zum Beispiel über das Isolieren von E / A in einen einzelnen Thread spreche, gilt dies sowohl für den JVM-Thread als auch für den OS-Thread, der die Arbeit erledigt.
Grau
21

Grüne Threads wurden in Java 1.2 durch native Threads ersetzt.

Steve-o
quelle
3
+1 - Mit anderen Worten, das Betriebssystem ordnet an, dass unterschiedliche Java-Threads unterschiedliche Kerne verwenden ... abhängig von der Systemplanung und den Einschränkungen der Ressourcenverwaltung.
Stephen C
21

Java profitiert von mehreren Kernen, wenn das Betriebssystem Threads über die verfügbaren Prozessoren verteilt. JVM selbst unternimmt nichts Besonderes, um die Threads gleichmäßig über mehrere Kerne hinweg zu planen. Ein paar Dinge zu beachten:

  • Bei der Implementierung paralleler Algorithmen ist es möglicherweise besser, so viele Threads zu erzeugen, wie Kerne vorhanden sind. ((Runtime.getRuntime().availableProcessors() ). Nicht mehr und nicht weniger.
  • Nutzen Sie die Einrichtungen der java.util.concurrent Paket enthaltenen .
  • Stellen Sie sicher, dass Java Concurrency in Practice in Ihrer persönlichen Bibliothek vorhanden ist.
Vijay Mathew
quelle
1
Nicht mehr, nicht weniger. Falsch. Gemäß dem von Ihnen vorgeschlagenen Buch sollte man spawnen (Anzahl der Prozessoren + 1), da der zusätzliche Thread, während ein Thread
E
2
Threads verarbeiten nur etwas, warten aber nicht auf Remote-Aufrufe (wie Datenbank, Remote-API, JMS usw.). Dann ist der obige Vorschlag sinnvoll. In der Praxis verwenden jedoch alle regulären Anwendungen Remote-Anrufe. Die beste Anzahl von Threads kann also je nach Latenz Ihrer Remote-Anrufe variieren. Lasttest machen und entscheiden.
Venkateswara Rao