Lassen Sie uns über das Java Valhalla-Projekt sprechen
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.
Motivation und Gründe für das Valhalla-Projekt
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.
Werttypen Das Konzept der Werttypen
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的特性:专用泛型。
Specialized Generics 专用泛型
当我们想对语言原语进行泛化时,我们目前使用装箱类型,例如整数表示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: 🎜🎜- Schnellere Objekte
- Benutzerdefinierte Grundelemente
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
. 🎜Fazit
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!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Leitfaden zur perfekten Zahl in Java. Hier besprechen wir die Definition, Wie prüft man die perfekte Zahl in Java?, Beispiele mit Code-Implementierung.

Leitfaden für Weka in Java. Hier besprechen wir die Einführung, die Verwendung von Weka Java, die Art der Plattform und die Vorteile anhand von Beispielen.

Leitfaden zur Smith-Zahl in Java. Hier besprechen wir die Definition: Wie überprüft man die Smith-Nummer in Java? Beispiel mit Code-Implementierung.

In diesem Artikel haben wir die am häufigsten gestellten Fragen zu Java Spring-Interviews mit ihren detaillierten Antworten zusammengestellt. Damit Sie das Interview knacken können.

Java 8 führt die Stream -API ein und bietet eine leistungsstarke und ausdrucksstarke Möglichkeit, Datensammlungen zu verarbeiten. Eine häufige Frage bei der Verwendung von Stream lautet jedoch: Wie kann man von einem Foreach -Betrieb brechen oder zurückkehren? Herkömmliche Schleifen ermöglichen eine frühzeitige Unterbrechung oder Rückkehr, aber die Stream's foreach -Methode unterstützt diese Methode nicht direkt. In diesem Artikel werden die Gründe erläutert und alternative Methoden zur Implementierung vorzeitiger Beendigung in Strahlverarbeitungssystemen erforscht. Weitere Lektüre: Java Stream API -Verbesserungen Stream foreach verstehen Die Foreach -Methode ist ein Terminalbetrieb, der einen Vorgang für jedes Element im Stream ausführt. Seine Designabsicht ist

Anleitung zum TimeStamp to Date in Java. Hier diskutieren wir auch die Einführung und wie man Zeitstempel in Java in ein Datum konvertiert, zusammen mit Beispielen.

Kapseln sind dreidimensionale geometrische Figuren, die aus einem Zylinder und einer Hemisphäre an beiden Enden bestehen. Das Volumen der Kapsel kann berechnet werden, indem das Volumen des Zylinders und das Volumen der Hemisphäre an beiden Enden hinzugefügt werden. In diesem Tutorial wird erörtert, wie das Volumen einer bestimmten Kapsel in Java mit verschiedenen Methoden berechnet wird. Kapselvolumenformel Die Formel für das Kapselvolumen lautet wie folgt: Kapselvolumen = zylindrisches Volumenvolumen Zwei Hemisphäre Volumen In, R: Der Radius der Hemisphäre. H: Die Höhe des Zylinders (ohne die Hemisphäre). Beispiel 1 eingeben Radius = 5 Einheiten Höhe = 10 Einheiten Ausgabe Volumen = 1570,8 Kubikeinheiten erklären Berechnen Sie das Volumen mithilfe der Formel: Volumen = π × R2 × H (4

Java ist eine beliebte Programmiersprache, die sowohl von Anfängern als auch von erfahrenen Entwicklern erlernt werden kann. Dieses Tutorial beginnt mit grundlegenden Konzepten und geht dann weiter zu fortgeschrittenen Themen. Nach der Installation des Java Development Kit können Sie das Programmieren üben, indem Sie ein einfaches „Hello, World!“-Programm erstellen. Nachdem Sie den Code verstanden haben, verwenden Sie die Eingabeaufforderung, um das Programm zu kompilieren und auszuführen. Auf der Konsole wird „Hello, World!“ ausgegeben. Mit dem Erlernen von Java beginnt Ihre Programmierreise, und wenn Sie Ihre Kenntnisse vertiefen, können Sie komplexere Anwendungen erstellen.
