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?
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?
Antworten:
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:
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 volatile
und synchronized
Anrufe 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.
Grüne Threads wurden in Java 1.2 durch native Threads ersetzt.
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:
Runtime.getRuntime().availableProcessors()
). Nicht mehr und nicht weniger.java.util.concurrent
Paket enthaltenen .