Java?Valhalla?Project項目介紹
前言:
在本文中,我們將介紹Valhalla項目——它的歷史原因、當前的開發(fā)狀態(tài),以及它發(fā)布后為日常Java開發(fā)人員帶來了什么。
Valhalla項目的動機和原因
Oracle的Java語言架構師Brian Goetz在一次演講中說,Valhalla項目的主要動機之一是希望使Java語言和運行時適應現代硬件。當Java語言誕生時(大約25年前撰寫本文時),獲取內存和算術運算的成本大致相同。
如今,這種情況已經發(fā)生了變化,內存提取操作的成本是算術操作的200到1000倍。就語言設計而言,這意味著導致指針提取的間接操作會對整體性能產生不利影響。
由于應用程序中的大多數Java數據結構都是對象,因此我們可以將Java視為指針密集型語言(盡管我們通常不會直接看到或操作它們)。這種基于指針的對象實現用于啟用對象標識,對象標識本身用于語言特性,如多態(tài)性、可變性和鎖定。默認情況下,這些特性適用于每個對象,無論它們是否真的需要。
遵循導致指針的標識鏈和導致間接的指針鏈,間接存在性能缺陷,邏輯上的結論是刪除那些不需要它們的數據結構。這就是值類型value types發(fā)揮作用的地方。
Value Types 值類型
值類型的概念是表示純數據聚合。這會刪除常規(guī)對象的功能。因此,我們有純數據,沒有身份。當然,這意味著我們也失去了使用對象標識可以實現的功能。因此,平等比較只能基于狀態(tài)進行。因此,我們不能使用表示多態(tài)性,也不能使用不可變或不可為空的對象。
由于我們不再有對象標識,我們可以放棄指針,改變值類型的一般內存布局,而不是對象。讓我們來比較一下類點和相應的值類型點之間的內存布局。
常規(guī)Point類的代碼和相應的內存布局為:
final class Point { final int x; final int y; }
另一方面,值類型Point的代碼和相應的內存布局將是:
value class Point { int x; int y }
這允許JVM將值類型展平為數組和對象,以及其他值類型。
在下圖中,我們展示了在數組中使用Point類時間接的負面影響:
另一方面,這里我們看到值類型Point[]
的相應內存結構:
它還使JVM能夠在棧上傳遞值類型,而不必在堆上分配它們。最后,這意味著我們得到的數據聚合具有類似于Java原語的運行時行為,如int
或float
。
但與原語不同,值類型可以有方法和字段。我們還可以實現接口并將其用作泛型類型。
因此,我們可以從兩個不同的角度來看值類型:
- 更快的對象
- 用戶定義原語
作為額外的錦上添花,我們可以使用值類型作為泛型類型,而無需裝箱。這直接將我們引向了另一個大型項目Valhalla的特性:專用泛型。
Specialized Generics 專用泛型
當我們想對語言原語進行泛化時,我們目前使用裝箱類型,例如整數表示Integer
或浮點表示Float
。這種裝箱創(chuàng)建了一個額外的間接層,從而首先破壞了使用原語提高性能的目的。
因此,我們在現有的框架和庫中看到了許多針對基元類型的專門化,如IntStream<T>
或ToIntFunction<T>
。這樣做是為了保持使用原語的性能提高。
因此,專門化泛型是為了消除這些“黑客”的需求。相反,Java語言努力為基本上所有東西啟用泛型類型:對象引用、原語、值類型,甚至可能是void
。
結論
我們初步了解了Valhalla項目將給Java語言帶來的變化。其中兩個主要目標是提高性能和減少泄漏的抽象。
性能增強通過展平對象圖和移除間接來解決。這將導致更高效的內存布局和更少的分配和垃圾回收。
當用作泛型類型時,原語和對象具有更相似的行為,這是更好的抽象。
到此這篇關于Java Valhalla Project項目介紹的文章就介紹到這了,更多相關Java Valhalla Project內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
maven插件spring-boot-starter-tomcat的使用方式
這篇文章主要介紹了maven插件spring-boot-starter-tomcat的使用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07Java并發(fā)編程中的ReentrantLock類詳解
這篇文章主要介紹了Java并發(fā)編程中的ReentrantLock類詳解,ReentrantLock是juc.locks包中的一個獨占式可重入鎖,相比synchronized,它可以創(chuàng)建多個條件等待隊列,還支持公平/非公平鎖、可中斷、超時、輪詢等特性,需要的朋友可以參考下2023-12-12SpringBoot中FailureAnalyzer的使用詳解
這篇文章主要介紹了SpringBoot中FailureAnalyzer的使用詳解,FailureAnalyzer攔截啟動時異常,將異常轉換成更加易讀的信息并包裝成org.springframework.boot.diagnostics.FailureAnalysis對象,監(jiān)控應用啟動過程,需要的朋友可以參考下2023-12-12SpringBoot+thymeleaf+Echarts+Mysql 實現數據可視化讀取的示例
本文主要介紹了SpringBoot+thymeleaf+Echarts+Mysql 實現數據可視化讀取的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-04-04