Warum wird in diesem speziellen Beispiel keine Escape-Analyse ausgelöst?Java

Java-Forum
Guest
 Warum wird in diesem speziellen Beispiel keine Escape-Analyse ausgelöst?

Post by Guest »

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)

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();
}
Ich möchte darauf hinweisen, dass dies kein Benchmarking-Test ist. Ich rufe die Funktion einfach wie folgt von der Hauptmethode aus auf:

Code: Select all

public static void main(String[] args) {
System.out.println(mapSum_boxed());
}
Die Ausgaben, die ich vom obigen Aufruf (mit der Flagge -verbose:gc) erhalte, sind:

Code: Select all

> Task :org.example.Main.main()
[0.002s][info][gc] Using G1
1000000000
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:

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();
}
Die Ausgaben sind dieses Mal:

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
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.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post