Heim > Java > javaLernprogramm > Erstellen Java-Lambda-Ausdrücke für jeden Aufruf ein neues Objekt auf dem Heap?

Erstellen Java-Lambda-Ausdrücke für jeden Aufruf ein neues Objekt auf dem Heap?

DDD
Freigeben: 2024-12-20 07:18:10
Original
239 Leute haben es durchsucht

Do Java Lambda Expressions Create a New Object on the Heap for Each Invocation?

Belasten Lambda-Ausdrücke den Heap bei jedem Aufruf mit Objekten?

Im modernen Java-Ökosystem haben sich Lambda-Ausdrücke zu einem leistungsstarken Werkzeug entwickelt für prägnante und ausdrucksstarke Codierung. Bei der Verwendung von Lambda-Ausdrücken besteht jedoch die Sorge, dass sie sich möglicherweise auf den Heap-Speicherverbrauch auswirken. Erstellt jede Ausführung eines Lambda-Ausdrucks ein bestimmtes Objekt auf dem Heap?

Vergleich von Lambda mit der Syntax anonymer Klassen

Betrachten wir den folgenden Lambda-Ausdruck:

myStream.forEach(item -> {
  // do something useful
});
Nach dem Login kopieren

Ist dies funktional äquivalent zum folgenden anonymen Klassenansatz?

myStream.forEach(new Consumer<Item>() {
  @Override
  public void accept(Item item) {
    // do something useful
  }
});
Nach dem Login kopieren

Der Die Antwort lautet: Ja, beide Ansätze haben das gleiche Funktionsverhalten. Die Implementierungsdetails sind jedoch recht unterschiedlich.

Die internen Details von Lambda-Ausdrücken

Das Verhalten von Lambda-Ausdrücken wird durch die JVM-Implementierung geregelt. Die JVM von Oracle verfolgt einen bestimmten Ansatz:

  • Wenn der Lambda-Ausdruck keine externen Werte erfasst (verweis auf Variablen, die außerhalb seines Gültigkeitsbereichs deklariert wurden), erstellt er eine Singleton-Instanz, die bei jedem Aufruf wiederverwendet wird.
  • Wenn der Lambda-Ausdruck externe Werte erfasst, wird für jeden Aufruf ein neues Objekt erstellt.

Dieser Ansatz stellt sicher, dass der Heap-Speicherplatz nicht vorhanden ist wird für einfache Lambda-Ausdrücke verschwendet, die den externen Zustand nicht ändern.

Auswirkungen auf die Leistung

Der Overhead von Lambda-Ausdrücken ist in den meisten praktischen Szenarien vernachlässigbar. Die Erstellung von Objekten, insbesondere für einfache Lambda-Ausdrücke ohne Werterfassung, wird durch den JIT-Compiler stark optimiert.

Best Practices

Der Heap-Verbrauch von Lambda-Ausdrücken hingegen schon Dies stellt im Allgemeinen kein Problem dar, es ist jedoch dennoch eine gute Praxis, sie in verschachtelten oder komplexen Datenstrukturen sinnvoll einzusetzen. In solchen Fällen kann die Verwendung herkömmlicher Schleifen zu einer besseren Leistung führen.

Zusammenfassend lässt sich sagen, dass Lambda-Ausdrücke in Java normalerweise nicht bei jeder Ausführung ein neues Objekt auf dem Heap erstellen, außer in Fällen, in denen sie externe Werte erfassen. Die JVM-Implementierung gewährleistet eine effiziente Wiederverwendung von Singleton-Instanzen für einfache Lambda-Ausdrücke und minimiert den Heap-Speicherplatzverbrauch und Auswirkungen auf die Leistung.

Das obige ist der detaillierte Inhalt vonErstellen Java-Lambda-Ausdrücke für jeden Aufruf ein neues Objekt auf dem Heap?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage