Java?Valhalla?Project項(xiàng)目介紹
前言:
在本文中,我們將介紹Valhalla項(xiàng)目——它的歷史原因、當(dāng)前的開(kāi)發(fā)狀態(tài),以及它發(fā)布后為日常Java開(kāi)發(fā)人員帶來(lái)了什么。
Valhalla項(xiàng)目的動(dòng)機(jī)和原因
Oracle的Java語(yǔ)言架構(gòu)師Brian Goetz在一次演講中說(shuō),Valhalla項(xiàng)目的主要?jiǎng)訖C(jī)之一是希望使Java語(yǔ)言和運(yùn)行時(shí)適應(yīng)現(xiàn)代硬件。當(dāng)Java語(yǔ)言誕生時(shí)(大約25年前撰寫(xiě)本文時(shí)),獲取內(nèi)存和算術(shù)運(yùn)算的成本大致相同。
如今,這種情況已經(jīng)發(fā)生了變化,內(nèi)存提取操作的成本是算術(shù)操作的200到1000倍。就語(yǔ)言設(shè)計(jì)而言,這意味著導(dǎo)致指針提取的間接操作會(huì)對(duì)整體性能產(chǎn)生不利影響。
由于應(yīng)用程序中的大多數(shù)Java數(shù)據(jù)結(jié)構(gòu)都是對(duì)象,因此我們可以將Java視為指針密集型語(yǔ)言(盡管我們通常不會(huì)直接看到或操作它們)。這種基于指針的對(duì)象實(shí)現(xiàn)用于啟用對(duì)象標(biāo)識(shí),對(duì)象標(biāo)識(shí)本身用于語(yǔ)言特性,如多態(tài)性、可變性和鎖定。默認(rèn)情況下,這些特性適用于每個(gè)對(duì)象,無(wú)論它們是否真的需要。
遵循導(dǎo)致指針的標(biāo)識(shí)鏈和導(dǎo)致間接的指針鏈,間接存在性能缺陷,邏輯上的結(jié)論是刪除那些不需要它們的數(shù)據(jù)結(jié)構(gòu)。這就是值類(lèi)型value types發(fā)揮作用的地方。
Value Types 值類(lèi)型
值類(lèi)型的概念是表示純數(shù)據(jù)聚合。這會(huì)刪除常規(guī)對(duì)象的功能。因此,我們有純數(shù)據(jù),沒(méi)有身份。當(dāng)然,這意味著我們也失去了使用對(duì)象標(biāo)識(shí)可以實(shí)現(xiàn)的功能。因此,平等比較只能基于狀態(tài)進(jìn)行。因此,我們不能使用表示多態(tài)性,也不能使用不可變或不可為空的對(duì)象。
由于我們不再有對(duì)象標(biāo)識(shí),我們可以放棄指針,改變值類(lèi)型的一般內(nèi)存布局,而不是對(duì)象。讓我們來(lái)比較一下類(lèi)點(diǎn)和相應(yīng)的值類(lèi)型點(diǎn)之間的內(nèi)存布局。
常規(guī)Point類(lèi)的代碼和相應(yīng)的內(nèi)存布局為:
final class Point {
final int x;
final int y;
}
另一方面,值類(lèi)型Point的代碼和相應(yīng)的內(nèi)存布局將是:
value class Point {
int x;
int y
}
這允許JVM將值類(lèi)型展平為數(shù)組和對(duì)象,以及其他值類(lèi)型。
在下圖中,我們展示了在數(shù)組中使用Point類(lèi)時(shí)間接的負(fù)面影響:

另一方面,這里我們看到值類(lèi)型Point[]的相應(yīng)內(nèi)存結(jié)構(gòu):

它還使JVM能夠在棧上傳遞值類(lèi)型,而不必在堆上分配它們。最后,這意味著我們得到的數(shù)據(jù)聚合具有類(lèi)似于Java原語(yǔ)的運(yùn)行時(shí)行為,如int或float。
但與原語(yǔ)不同,值類(lèi)型可以有方法和字段。我們還可以實(shí)現(xiàn)接口并將其用作泛型類(lèi)型。
因此,我們可以從兩個(gè)不同的角度來(lái)看值類(lèi)型:
- 更快的對(duì)象
- 用戶定義原語(yǔ)
作為額外的錦上添花,我們可以使用值類(lèi)型作為泛型類(lèi)型,而無(wú)需裝箱。這直接將我們引向了另一個(gè)大型項(xiàng)目Valhalla的特性:專(zhuān)用泛型。
Specialized Generics 專(zhuān)用泛型
當(dāng)我們想對(duì)語(yǔ)言原語(yǔ)進(jìn)行泛化時(shí),我們目前使用裝箱類(lèi)型,例如整數(shù)表示Integer或浮點(diǎn)表示Float。這種裝箱創(chuàng)建了一個(gè)額外的間接層,從而首先破壞了使用原語(yǔ)提高性能的目的。
因此,我們?cè)诂F(xiàn)有的框架和庫(kù)中看到了許多針對(duì)基元類(lèi)型的專(zhuān)門(mén)化,如IntStream<T>或ToIntFunction<T>。這樣做是為了保持使用原語(yǔ)的性能提高。
因此,專(zhuān)門(mén)化泛型是為了消除這些“黑客”的需求。相反,Java語(yǔ)言努力為基本上所有東西啟用泛型類(lèi)型:對(duì)象引用、原語(yǔ)、值類(lèi)型,甚至可能是void。
結(jié)論
我們初步了解了Valhalla項(xiàng)目將給Java語(yǔ)言帶來(lái)的變化。其中兩個(gè)主要目標(biāo)是提高性能和減少泄漏的抽象。
性能增強(qiáng)通過(guò)展平對(duì)象圖和移除間接來(lái)解決。這將導(dǎo)致更高效的內(nèi)存布局和更少的分配和垃圾回收。
當(dāng)用作泛型類(lèi)型時(shí),原語(yǔ)和對(duì)象具有更相似的行為,這是更好的抽象。
到此這篇關(guān)于Java Valhalla Project項(xiàng)目介紹的文章就介紹到這了,更多相關(guān)Java Valhalla Project內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)多級(jí)表頭和復(fù)雜表頭的導(dǎo)出功能
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)多級(jí)表頭和復(fù)雜表頭的導(dǎo)出功能的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03
Java通過(guò)SMS短信平臺(tái)實(shí)現(xiàn)發(fā)短信功能 含多語(yǔ)言
這篇文章主要為大家詳細(xì)介紹了Java通過(guò)SMS短信平臺(tái)實(shí)現(xiàn)發(fā)短信功能的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-07-07
Java?Hutool工具包中HttpUtil的日志統(tǒng)一打印及統(tǒng)一超時(shí)時(shí)間配置
Hutool是一個(gè)Java基礎(chǔ)工具類(lèi),對(duì)文件、流、加密解密、轉(zhuǎn)碼、正則、線程、XML等JDK方法進(jìn)行封裝,組成各種Util工具類(lèi),這篇文章主要給大家介紹了關(guān)于Java?Hutool工具包中HttpUtil的日志統(tǒng)一打印及統(tǒng)一超時(shí)時(shí)間配置的相關(guān)資料,需要的朋友可以參考下2024-01-01
SpringBoot實(shí)現(xiàn)阿里云快遞物流查詢的示例代碼
本文將基于springboot實(shí)現(xiàn)快遞物流查詢,物流信息的獲取通過(guò)阿里云第三方實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2021-10-10
Java使用hutool實(shí)現(xiàn)文件大小的友好輸出
這篇文章主要為大家詳細(xì)介紹了Java如何使用hutool實(shí)現(xiàn)文件大小的友好輸出,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解下2023-11-11
springboot日期格式化及時(shí)差問(wèn)題分析
這篇文章主要介紹了springboot日期格式化,時(shí)差問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12
Maven Spring jar包啟動(dòng)報(bào)錯(cuò)問(wèn)題解決方案
maven 編譯jar包,放在linux服務(wù)器啟動(dòng)不起來(lái),提示:xxxx-0.0.1-SNAPSHOT.jar中沒(méi)有主清單屬性,接下來(lái)通過(guò)本文給大家分享問(wèn)題原因及解決方案,感興趣的朋友跟隨小編一起看看吧2023-10-10

