Warum wird in diesem speziellen Beispiel keine Escape-Analyse ausgelöst?
Posted: 30 Dec 2024, 17:21
Dies geschieht auf offenem JDK 17 und alle Tests werden mit 256 MB Speicher ausgeführt. Ich habe Escape-Analyse-Interaktionen mit Streams durch einige einfache Tests getestet und bin auf etwas Interessantes gestoßen.
Der folgende Code scheint die Escape-Analyse einwandfrei auszulösen (getestet durch Hinzufügen von -verbose:gc< /code> und Ausführen des Codes mit und ohne -XX:-DoEscapeAnalysis Läufe ohne EA drucken GC-Aktivität, während Läufe mit EA dies nicht tun)
Ich möchte darauf hinweisen, dass dies kein Benchmarking-Test ist. Ich rufe die Funktion einfach wie folgt von der Hauptmethode aus auf:
Die Ausgaben, die ich vom obigen Aufruf (mit der Flagge -verbose:gc) erhalte, sind:
Wenn ich jedoch die folgende Änderung vornehme (eine zusätzliche Karte() hinzufügen), kann die Escape-Analyse nicht ausgelöst werden und die GC-Aktivität wird auf der Konsole ausgegeben:
Die Ausgaben sind dieses Mal:
Hat jemand eine Ahnung, warum das passiert? Ich dachte zunächst, dass die Operation „map(x->1) irgendwie den gesamten Stream in den Typ „Integer“ konvertiert, aber das scheint unwahrscheinlich ... und das hätte eigentlich bei boxed()< passieren sollen /code> Bühne sowieso.
Der folgende Code scheint die Escape-Analyse einwandfrei auszulösen (getestet durch Hinzufügen von -verbose:gc< /code> und Ausführen des Codes mit und ohne -XX:-DoEscapeAnalysis Läufe ohne EA drucken GC-Aktivität, während Läufe mit EA dies nicht tun)
Code: Select all
public static int mapSum_boxed(){
record TestObject(int i){};
return IntStream.range(0, 1_000_000_000)
.boxed()
.map(x-> new TestObject(1))
.mapToInt(x-> x.i())
.sum();
}
Code: Select all
public static void main(String[] args) {
System.out.println(mapSum_boxed());
}
Code: Select all
> Task :org.example.Main.main()
[0.002s][info][gc] Using G1
1000000000
Code: Select all
public static int mapSum_boxed(){
record TestObject(int i){};
return IntStream.range(0, 1_000_000_000)
.boxed()
.map(x-> 1) // new TestObject(1))
.mapToInt(x-> x.i())
.sum();
}
Code: Select all
> Task :org.example.Main.main()
[0.002s][info][gc] Using G1
[0.053s][info][gc] GC(0) Pause Young (Normal) (G1 Evacuation Pause) 23M->2M(246M) 1.398ms
[0.117s][info][gc] GC(1) Pause Young (Normal) (G1 Evacuation Pause) 120M->2M(246M) 0.965ms
.... // many many more lines of GC
[6.530s][info][gc] GC(123) Pause Young (Normal) (G1 Evacuation Pause) 258M->2M(428M) 0.724ms
1000000000