首頁 >Java >java教程 >一起聊聊Java Valhalla Project項目

一起聊聊Java Valhalla Project項目

WBOY
WBOY轉載
2022-09-07 14:07:072352瀏覽

本篇文章為大家帶來了關於java的相關知識,其中主要介紹了Java Valhalla Project專案介紹,圍繞主題展開詳細的內容介紹,下面一起來看一下,希望對大家有幫助。

一起聊聊Java Valhalla Project項目

推薦學習:《java影片教學

在本文中,我們將介紹Valhalla專案-它的歷史原因、目前的開發狀態,以及它發布後為日常Java開發人員帶來了什麼。

Valhalla專案的動機和原因

Oracle的Java語言架構師Brian Goetz在一次演講中說,Valhalla專案的主要動機之一是希望使Java語言和運行時適應現代硬件。當Java語言誕生時(大約25年前撰寫本文時),取得記憶體和算術運算的成本大致相同。

如今,這種情況已經發生了變化,記憶體提取操作的成本是算術操作的200到1000倍。就語言設計而言,這意味著導致指標提取的間接操作會對整體效能產生不利影響。

由於應用程式中的大多數Java資料結構都是對象,因此我們可以將Java視為指標密集型語言(儘管我們通常不會直接看到或操作它們) 。這種基於指標的物件實作用於啟用物件標識,物件標識本身用於語言特性,如多態性、可變性和鎖定。預設情況下,這些特性適用於每個對象,無論它們是否真的需要。

遵循導致指標的標識鍊和導致間接的指標鏈,間接存在效能缺陷,邏輯上的結論是刪除那些不需要它們的資料結構。這就是值類型value types發揮作用的地方。

Value Types 值類型

值類型的概念是表示純資料聚合。這會刪除常規物件的功能。因此,我們有純數據,沒有身分。當然,這意味著我們也失去了使用物件標識可以實現的功能。因此,平等比較只能基於狀態進行。因此,我們不能使用表示多態性,也不能使用不可變或不可為空的物件。

由於我們不再有物件標識,我們可以放棄指針,改變值類型的一般記憶體佈局,而不是物件。讓我們來比較一下類別點和對應的值類型點之間的記憶體佈局。

常規Point類別的程式碼和對應的記憶體佈局為:

final class Point {
  final int x;
  final int y;
}

另一方面,值類型Point的程式碼和對應的記憶體佈局將是:

value class Point {
  int x;
  int y
}

這允許JVM將值類型展平為陣列和對象,以及其他值類型。

在下圖中,我們展示了在陣列中使用Point類別時間接的負面影響:

##另一方面,這裡我們看到值類型

Point[]的對應記憶體結構:

#它也讓JVM能夠在堆疊上傳遞值類型,而不必在堆上分配它們。最後,這意味著我們得到的資料聚合具有類似Java原語的執行時間行為,如

intfloat

但與原語不同,值類型可以有方法和欄位。我們也可以實作介面並將其用作泛型類型。

因此,我們可以從兩個不同的角度來看值類型:

    #更快的物件
  • 使用者定義原語
作為額外的錦上添花,我們可以使用值類型作為泛型類型,而

無需裝箱。這直接將我們引向了另一個大型專案Valhalla的特性:專用泛型。

Specialized Generics 專用泛型

當我們想要對語言原語進行泛化時,我們目前使用裝箱類型,例如整數表示

Integer或浮點表示Float。這種裝箱創造了一個額外的間接層,從而首先破壞了使用原語來提高性能的目的。

因此,我們在現有的框架和函式庫中看到了許多針對基元類型的專門化,如

IntStream<T>ToIntFunction<T> 。這樣做是為了保持使用原語的性能提升。

因此,專門化泛型是為了消除這些「駭客」的需求。相反,Java語言努力為基本上所有東西啟用泛型類型:物件參考、原語、值類型,甚至可能是

void

結論

我們初步了解了Valhalla專案將為Java語言帶來的改變。其中兩個主要目標是提高效能和減少洩漏的抽象化。

效能增強透過展平物件圖和移除間接來解決。這將導致更有效率的記憶體佈局和更少的分配和垃圾回收。

當用作泛型類型時,原語和物件具有更相似的行為,這是更好的抽象。

推薦學習:《java影片教學

以上是一起聊聊Java Valhalla Project項目的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:jb51.net。如有侵權,請聯絡admin@php.cn刪除