Ich habe vor einem Jahr einige Tests bezüglich Multicore mit Java 7 durchgeführt. Zuerst habe ich einige Berechnungen nur im Hauptthread durchgeführt (CPU-Auslastung zeigte, dass nur ein Kern die ganze Arbeit verrichtet) und dann Callable mit einer ExecutorService-Instanz implementiert. Während es läuft alle Kerne, wo die Arbeit.
Jetzt, ein Jahr später, muss ich ein kleines Programm (mit Java 8) implementieren, das viele Daten interpoliert. Die gesamte Arbeit ist im Haupt-Thread implementiert (ohne Callable und ExecutorService), aber wenn ich das Programm ausführe, zeigt mir die CPU-Auslastung, dass alle 4 Kerne bei 98% sind.
Verteilt java 8 die Arbeit automatisch auf alle CPU-Kerne? Ich bin verwirrt ...
Hier ein bisschen Code ...
MapGenerator.java
%Vor%Region.java:
%Vor%Chunk.java: (SRTMHandler.getHeightForLatLon () führt einige Geo-Berechnungen durch und liest dann einen Wert in einem Byte-Array, nichts besonderes)
%Vor%Java 8 verteilt die Arbeit nicht automatisch auf alle CPU-Kerne, es sei denn, Ihr Code fordert dies explizit an (z. B. durch Verwendung paralleler Streams).
In einigen speziellen Fällen wird der Hotspot-Compiler den Code automatisch vektorisieren , siehe zum Beispiel JDK-6340864 . Die automatische Vektorisierung verwendet jedoch spezielle SIMD CPU-Anweisungen, nicht mehrere CPUs.
Siehe auch diese Antworten:
(Beachten Sie, dass ich die Antwort neu geschrieben habe und den Teil entfernt habe, der durch die Kommentare korrigiert wurde)
Ich habe diese Situation auch erlebt. In meinem Fall ist es die häufige Garbage-Collection, die eine signifikant hohe (98%) CPU-Auslastung verursacht. Wie in einigen Kommentaren unter den ursprünglichen Fragen erwähnt, verwendet der Java-GC standardmäßig Multi-Threading.
Meiner Meinung nach ist Ihr Programm nicht an die CPU gebunden. Daher ist es nicht wahrscheinlich, 4 Kerne vollständig zu verwenden. Auf der anderen Seite, wenn nicht genug Heap-Speicherplatz für Ihr Programm reserviert ist, wird der häufige GC die CPU-Ressourcen leicht erschöpfen. Nach dem Erhöhen der Heap-Größe ist alles in Ordnung.
Tags und Links java java-8 multithreading multiprocessing multicore