Dieser Artikel vermittelt Ihnen relevantes Wissen über Java, das hauptsächlich die Einführung des Java Valhalla-Projekts und eine detaillierte Einführung in das Thema vorstellt. Ich hoffe, es wird für alle hilfreich sein.
Empfohlene Studie: „Java-Video-Tutorial“
In diesem Artikel stellen wir das Valhalla-Projekt vor – seine historischen Gründe, den aktuellen Entwicklungsstatus und was es den alltäglichen Java-Entwicklern nach seiner Veröffentlichung gebracht hat. Was.
Der Java-Spracharchitekt von Oracle, Brian Goetz, sagte in einer Rede, dass eine der Hauptmotivationen für das Valhalla-Projekt der Wunsch sei, die Java-Sprache und -Laufzeit an moderne Hardware anzupassen. Als die Java-Sprache geboren wurde (zum Zeitpunkt des Schreibens vor etwa 25 Jahren), kostete der Zugriff auf Speicher und arithmetische Operationen ungefähr das Gleiche.
Heutzutage hat sich diese Situation geändert, Speicherabrufoperationen sind 200 bis 1000 Mal teurer als arithmetische Operationen. In Bezug auf das Sprachdesign bedeutet dies, dass indirekte Operationen, die zu Zeigerauszügen führen, die Gesamtleistung negativ beeinflussen können.
Da die meisten Java-Datenstrukturen in einer Anwendung Objekte sind, können wir uns Java als eine zeigerintensive Sprache vorstellen (obwohl wir sie normalerweise nicht direkt sehen oder manipulieren). Diese zeigerbasierte Objektimplementierung wird verwendet, um die Objektidentifizierung zu ermöglichen, die wiederum für Sprachfunktionen wie Polymorphismus, Veränderlichkeit und Sperren verwendet wird. Standardmäßig gelten diese Eigenschaften für jedes Objekt, unabhängig davon, ob sie tatsächlich benötigt werden.
Folgt man der Kette von Identitäten, die zu Zeigern führt, und der Kette von Zeigern, die zur Indirektion führt, hat die Indirektion einen Leistungsnachteil und die logische Schlussfolgerung besteht darin, diejenigen Datenstrukturen zu entfernen, die sie nicht benötigen. Hier kommen Werttypen ins Spiel.
besteht darin, eine reine Datenaggregation darzustellen. Dadurch wird die Funktionalität regulärer Objekte entfernt. Wir haben also reine Daten, keine Identität. Damit verlieren wir natürlich auch die Funktionalität, die durch Objektidentifikation erreicht werden kann. Daher können Gleichstellungsvergleiche nur auf der Grundlage des Status durchgeführt werden. Daher können wir keinen Darstellungspolymorphismus verwenden und auch keine unveränderlichen oder nicht nullbaren Objekte verwenden.
Da wir keine Objektidentität mehr haben, können wir Zeiger aufgeben und das allgemeine Speicherlayout von Werttypen anstelle von Objekten ändern. Vergleichen wir das Speicherlayout zwischen Klassenpunkten und entsprechenden Werttyppunkten.
Der Code und das entsprechende Speicherlayout für die reguläre Point-Klasse wären:
final class Point { final int x; final int y; }
Andererseits wären der Code und das entsprechende Speicherlayout für den Werttyp Point:
value class Point { int x; int y }
Dadurch kann die JVM Werttypen in Arrays, Objekte und andere Werttypen verflachen.
Im Bild unten zeigen wir die indirekten negativen Auswirkungen bei der Verwendung der Point-Klasse in einem Array:
Andererseits sehen wir hier die Entsprechung des Werttyps Point[] Speicherstruktur: <code>Point[]
的相应内存结构:
它还使JVM能够在栈上传递值类型,而不必在堆上分配它们。最后,这意味着我们得到的数据聚合具有类似于Java原语的运行时行为,如int
或float
。
但与原语不同,值类型可以有方法和字段。我们还可以实现接口并将其用作泛型类型。
因此,我们可以从两个不同的角度来看值类型:
作为额外的锦上添花,我们可以使用值类型作为泛型类型,而无需装箱。这直接将我们引向了另一个大型项目Valhalla的特性:专用泛型。
当我们想对语言原语进行泛化时,我们目前使用装箱类型,例如整数表示Integer
或浮点表示Float
。这种装箱创建了一个额外的间接层,从而首先破坏了使用原语提高性能的目的。
因此,我们在现有的框架和库中看到了许多针对基元类型的专门化,如IntStream<T>
或ToIntFunction<T>
。这样做是为了保持使用原语的性能提高。
因此,专门化泛型是为了消除这些“黑客”的需求。相反,Java语言努力为基本上所有东西启用泛型类型:对象引用、原语、值类型,甚至可能是void
int
oder float
ähnelt. 🎜🎜Aber im Gegensatz zu Grundelementen können Werttypen Methoden und Felder haben. Wir können auch Schnittstellen implementieren und sie als generische Typen verwenden. 🎜🎜🎜So können wir Werttypen aus zwei verschiedenen Perspektiven betrachten: 🎜🎜Integer
oder die Gleitkommadarstellung Float
. Dieses Boxing erzeugt eine zusätzliche Indirektionsebene und macht damit den Zweck der Verwendung von Primitiven zur Leistungsverbesserung von vornherein zunichte. 🎜🎜So sehen wir viele Spezialisierungen für primitive Typen in vorhandenen Frameworks und Bibliotheken, wie zum Beispiel IntStream<T>
oder ToIntFunction<T>
. Dies geschieht, um die Leistungsverbesserungen durch die Verwendung von Grundelementen aufrechtzuerhalten. 🎜🎜Die Spezialisierung auf Generika besteht also darin, diese „Hacks“ überflüssig zu machen. Stattdessen ist die Java-Sprache bestrebt, generische Typen für praktisch alles zu ermöglichen: Objektreferenzen, Grundelemente, Werttypen und vielleicht sogar void
. 🎜Wir haben ein vorläufiges Verständnis der Änderungen, die das Valhalla-Projekt für die Java-Sprache mit sich bringen wird. Zwei der Hauptziele bestehen darin, die Leistung zu verbessern und undichte Abstraktionen zu reduzieren.
Leistungsverbesserungen werden durch die Abflachung des Objektdiagramms und das Entfernen der Indirektion behoben. Dies führt zu einem effizienteren Speicherlayout und weniger Zuweisungen und Garbage Collections.
Bei Verwendung als generischer Typ weisen Grundelemente und Objekte ein ähnlicheres Verhalten auf, was eine bessere Abstraktion darstellt.
Empfohlenes Lernen: „Java-Video-Tutorial“
Das obige ist der detaillierte Inhalt vonLassen Sie uns über das Java Valhalla-Projekt sprechen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!