成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Valhalla項目:了解Java史詩級重構

譯文
開發 前端
在Java中,除了int這樣的原語之外,所有的事物都是對象。事實證明,這一設置對Java產生了巨大的影響,這些年來,這種影響越來越大。這個看似微不足道的設計決策會在集合和泛型等關鍵領域引起問題。它還限制了某些性能優化。

?譯者 | 李睿

審校 | 孫淑娟?

在Java中,除了int這樣的原語之外,所有的事物都是對象。事實證明,這一設置對Java產生了巨大的影響,這些年來,這種影響越來越大。這個看似微不足道的設計決策會在集合和泛型等關鍵領域引起問題。它還限制了某些性能優化。Java語言重構項目Valhalla旨在糾正這些問題。Valhalla項目負責人Brian Goetz表示,Valhalla將“彌合原語類和對象之間的裂痕”。?

可以說,Valhalla項目是一次史詩級的重構,旨在解決自Java誕生以來一直隱藏在平臺中的技術債務。這種徹底的進化證明了Java不僅是經典,而且仍然處于編程語言設計的前沿。以下了解Valhalla項目的關鍵技術組件,以及為什么它們對Java的未來如此重要。 ?

Java中的性能問題 ?

當Java在上世紀90年代首次引入時,決定所有用戶創建的類型都是類。只有少數原語類被當作特殊類型。它們不是作為基于指針的類結構處理的,而是直接映射到操作系統類型。8種原語類型是int、byte、short、long、float、double、boolean和char。?

直接將這些變量映射到操作系統對性能來說更好,因為數值操作在去掉對象的引用開銷時性能更好。而且,所有數據最終在程序中都解析為這8種基本類型。類只是一種結構和組織層,它提供了更強大的處理基本類型的方法。另一種結構是數組。原語、類和數組構成了Java表達能力的全部范圍。 ?

但是原語是與類和數組不同的,程序員已經學會了直觀地處理這些差異。例如,原語是按值傳遞,而對象是按引用傳遞。其中的原因相當深刻,這歸結為身份的問題。可以說,原語值是可替換的:intx=4是整數4,無論它出現在哪里。可以在equals()vs==中看到這種區別,前者測試對象的值等價性,后者測試對象的同一性。如果兩個引用在內存中共享相同的空間,它們滿足==,這意味著它們是同一個對象。任何設置為4的int類型也滿足==,而int類型根本不支持.equals()。 ?

Java虛擬機(JVM)可以利用處理原語的方式來優化存儲、檢索和操作原語的方式。特別是,如果平臺確定一個變量沒有改變(也就是說,它是常數或不可變的),那么就可以對其進行優化。 ?

相比之下,對象則不適合這種優化,因為它們有一個身份。作為類的實例,對象所保存的數據既可以是原語,也可以是其他類。對象本身用一個指針句柄來尋址。這就創建了一個引用網絡:對象圖。每當某個值被更改時(或者即使它可能被更改),JVM都必須維護對象的最終記錄以供參考。需要引用對象是一些性能優化的障礙。?

性能上的困難還不止于此。對象作為引用桶的特性意味著它們以一種非常松散的方式存在于內存中。Fluffy是一個技術術語,用來描述JVM無法壓縮對象以最小化其內存占用這一事實。當一個對象有對另一個對象的引用作為其組成的一部分時,JVM被迫維護該指針關系。(在某些情況下,巧妙的優化可以幫助確定嵌套引用是特定實體的唯一句柄。) ?

在他撰寫的一篇博客文章中,Goetz使用了一系列點來說明引用的非密集性可以使用類。假設有一個Landmark類,它有一個名稱和一個地理位置字段。這意味著一個像圖1所示的內存結構: ?

圖1 Java對象的“蓬松”內存占用

想要實現的是在適當的時候保存對象的能力,如圖2所示?

圖2. 內存中密集的對象?

這就是早期設計決策對Java平臺的性能挑戰的概述。以下考慮這些決策如何在三個關鍵領域影響性能。 ?

問題1:方法調用和傳遞值 ?

內存中對象的默認結構對于內存和緩存來說都是低效的。此外,還有機會在方法調用約定方面取得進展。能夠將按值調用參數傳遞給具有類語法的方法(在適當的情況下)將帶來更高性能和好處。?

問題2:箱子和自動裝箱?

除了低效率之外,原語和類之間的區別還帶來了語言級的困難。創建像Integer和Long這樣的原語“箱”(以及自動裝箱)是為了減輕這種區別所帶來的問題。但是,它并不能真正解決這些問題,而且它給開發人員和機器都帶來了一定程度的開銷。作為開發人員,必須了解并記住int和Integer(以及ArrayList<Integer>, int[], Integer[],以及缺少ArrayList<int>)之間的區別。與此同時,機器必須在兩者之間進行轉換。?

在某種程度上,裝箱模糊了這些實體如何工作的底層細微差別,因此很難同時了解類語法的強大功能和原語的性能。?

問題3:泛型和流?

在泛型中,所有這些考慮因素都非常重要。泛型旨在使跨功能的泛化更容易、更顯式,但這組非對象變量(原語)的挑剔存在只會導致它崩潰。<int>不存在,因為int根本不是一個類,它不是對象的后代。?

這個問題在集合和流等庫中也有體現,通過提供IntStream和其他非泛型變體,泛型庫函數的理想被迫處理int與Integer、long與long等現實。?

Valhalla的解決方案:值類和原語類?

Valhalla計劃從根本上解決這些問題。第一個也是最基本的概念是值類。這里的思想是,可以定義一個類,它具有類的所有優點,比如具有方法并能夠實現泛型,但沒有標識。在實踐中,這意味著類是不可變的,不能是布局多態的(其中超類可以通過抽象屬性對子類進行操作)。?

值類為人們提供了一種清晰而明確的方式來獲得所追求的性能特征,同時仍然可以訪問類語法和獲得行為的好處。這意味著庫構建者也可以使用它們,從而改進API設計。?

更進一步的是原語類,它類似于一個更極端的值類。本質上,原語類是一個真正的原語變量的薄包裝器,但帶有類方法。這有點像自定義的流線型原語箱。改進在于使裝箱系統更加顯式和可擴展。此外,由原語類包裝的原語值保留了原語的性能特征(沒有底層的裝箱和拆箱)。因此,原語類可以在任何類可以存在的地方使用——例如,在Object[]數組中?;绢愋筒荒転榭?它們不能被設置為空)。?

一般來說,Valhalla項目使原語和用戶定義類型更加接近。這為開發人員在純原語和對象之間提供了更多的選擇,并使權衡變得明確。它還使這些操作總體上更加一致。特別是,新的原語系統將使原語和對象的工作方式、它們的裝箱方式以及如何添加新的原語和對象變得更加流暢。?

Java的語法將如何變化?

Valhalla已經看到了一些不同的語法建議,但現在項目有了明確的形式和方向。兩個新的關鍵字修改了類關鍵字:value和primitive。用value class語法聲明的類將放棄其標識,并在這一過程中獲得性能改進。除了可變性和多態限制外,對類的大部分期望仍然適用,并且此類類可以完全參與泛型代碼(例如object[]或ArrayList<T>)。值類默認為null。?

原語類語法創建的類比傳統對象和傳統原語更進一步。這些類默認為字段的基礎值(int為0,double為0.0,等等),并且不能為空。原語類在優化方面獲得最多,在特性方面犧牲最多。原語類最終將被用于對平臺中的所有原語建模,這意味著用戶和庫定義的原語添加將與內置組件參與到同一個系統中。?

IdentityObject和ValueObject?

IdentityObject和ValueObject是Valhalla項目中引入的兩個新接口。這將允許運行時確定正在處理的類的類型。 ?

對于有經驗的Java開發人員來說,最根本的語法更改可能是增加了.ref成員。所有類型現在都有V.ref()字段。這個字段的操作類似于基本類型上的box,所以是int.ref類似于用Integer包裝int。普通類將解析.ref到它們的引用??傮w效果是提供了一種一致的方式來請求變量的引用,而不管變量的類型是什么。這也會導致所有Java數組都是“協變的”,也就是說,它們都起源于Object[]。因此,int[]現在來自Object[],可以在任何需要的地方使用。 ?

結論?

值類和原語類將對Java及其生態系統產生重大影響。當前的路線圖計劃首先引入值類,然后是原語類。接下來將遷移現有的原語裝箱類(如Integer)以使用新的原語類。有了這些特性,下一個被稱為通用泛型的特性將允許原語類直接與泛型一起使用,從而消除API中重用的許多復雜性。最后,專門的泛型(允許T擴展Foo的所有表達能力)將與原語類集成。 ?

Valhalla項目及其組成項目仍處于設計階段,但越來越接近。項目周圍的活動表明,價值類很快就會出現在JDK預覽中。?

在這些有趣的技術工作之外,讓人感覺到了Java的持續活力。人們有意愿也有能力去識別平臺在哪些方面可以從根本上進行改進,這是保持Java相關性的真正承諾的證據。而Project Loom是對Java未來持樂觀態度的另一個項目。?

原文標題:??Project Valhalla: A look inside Java’s epic refactor??,作者:Matthew Tyson

?

責任編輯:華軒 來源: 51CTO
相關推薦

2023-11-13 08:21:35

阿里云盤

2021-01-05 14:22:35

比特幣貨幣投資

2023-09-25 08:08:56

CAA開發者團隊

2017-09-14 16:50:37

Dell筆記本

2024-07-23 08:59:17

Set開發前端

2022-04-25 20:52:22

UbuntuLinux

2022-05-26 05:10:46

郵件詐騙釣魚郵件加密

2021-12-13 17:44:51

程序員漏洞開發

2021-01-14 11:05:41

項目配置屬性

2021-08-17 16:18:33

數字人民幣數字貨幣區塊鏈

2022-05-30 14:04:23

Log4j遠程代碼漏洞

2023-12-28 14:38:27

2023-07-14 12:10:08

AI自主權離職

2020-11-11 16:46:35

蘋果macOS操作系統

2023-05-19 10:38:52

ChatGPTOpenAIiOS

2023-05-26 09:49:21

英偉達AI

2021-12-11 13:22:10

漏洞公司Log4j

2017-07-07 16:07:41

2017-03-06 17:00:37

SSMMaven結構
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产成人在线一区二区 | 手机看片在线播放 | 日韩美av | 欧美一区二区另类 | 成人国产精品免费观看视频 | 欧美一区二区三区在线视频 | 黄色一级片aaa | 欧美一区二区网站 | 在线中文字幕日韩 | 日韩精品一区二区三区 | 黄色成人免费在线观看 | 成人精品视频 | 一级日韩 | 午夜视频精品 | 日韩中文视频 | 精品日韩一区 | 精品影院| 欧美日韩高清免费 | 中文字幕国产视频 | 91美女在线 | 欧美国产中文字幕 | 亚洲精品一级 | 亚洲成人av | 成人一区二区电影 | 久久久久久国模大尺度人体 | 97国产精品视频 | 涩涩视频在线观看免费 | 黄色毛片在线观看 | 成人免费视频在线观看 | 中文字幕在线三区 | 日韩午夜影院 | 二区国产 | 日韩福利 | 第一区在线观看免费国语入口 | 中文字幕在线一区二区三区 | 中文字幕一区二区三区在线观看 | 在线a视频网站 | caoporn视频在线 | 一级片子| 欧美日韩中文在线 | 成人性视频免费网站 |