Java將引入新的對(duì)象類型來(lái)解決內(nèi)存利用問(wèn)題

2022年Java將有什么新的特性和改進(jìn)因宇,我相信很多Java開發(fā)者都想知道贷盲。結(jié)合Java語(yǔ)言架構(gòu)師布萊恩·格茨Brian Goetz)最近的一些分享队塘,胖哥給大家爆個(gè)料整袁。老規(guī)矩账忘,點(diǎn)贊走起志膀。

Valhalla

布萊恩·格茨在去年底發(fā)表了一篇名為State of Valhalla的文章熙宇,里面信息量非常大,里面提到早在2014年Java項(xiàng)目組就啟動(dòng)了一個(gè)名叫Valhalla的項(xiàng)目溉浙,這個(gè)項(xiàng)目將為JVM平臺(tái)帶來(lái)更加靈活的烫止、扁平化的數(shù)據(jù)類型。在2021年該項(xiàng)目將有進(jìn)一步的動(dòng)作戳稽,值對(duì)象(value objects)馆蠕、原始類(primitive classes)專用泛型(specialized generics)即將引入JVM平臺(tái)惊奇。今天先來(lái)聊聊這個(gè)值對(duì)象是個(gè)啥互躬。

我們知道什么是“值”,什么是“對(duì)象”颂郎,但是什么是“值對(duì)象”呢吼渡?不光你們懵逼,我也懵逼乓序,來(lái)一起研究研究寺酪。

Java類型系統(tǒng)的不足

Java的類型系統(tǒng)

Java類型系統(tǒng)由內(nèi)置的10種類型組成,這10種類型無(wú)法直接表達(dá)復(fù)雜的數(shù)據(jù)結(jié)構(gòu)替劈,例如字符串寄雀、三維坐標(biāo)、空間向量等等陨献,但是開發(fā)者可以用這10種類型來(lái)為業(yè)務(wù)實(shí)體建模盒犹,Java的類型體系是非常有用的。

但是Java類型仍然存在“缺陷”眨业, 同一個(gè)類的兩個(gè)對(duì)象包含完全相同的屬性急膀,但是它們的內(nèi)存尋址是不一樣的。

所以從某種意義上說(shuō)坛猪,他們有自己的身份標(biāo)識(shí)脖阵。

但是對(duì)于原始類型就不一樣了,如果一個(gè)int類型的變量值為7墅茉,另一個(gè)也為7,區(qū)分它們有意義嗎呜呐?這個(gè)7還是那個(gè)7就斤?顯然是無(wú)意義的。

讓我們?cè)賮?lái)舉一個(gè)現(xiàn)實(shí)中的例子蘑辑,兩件相同尺寸洋机、材質(zhì)的紅色衣服肯定是兩件不同的衣服,但是它們的材質(zhì)肯定是一種材質(zhì)洋魂,顏色肯定是一種顏色绷旗,不會(huì)有傻子認(rèn)為這是兩種顏色喜鼓。這里面的尺寸當(dāng)然可以通過(guò)Java中的原始類型去描述,但是材質(zhì)和顏色不行(雖然顏色可以用十六進(jìn)制表示)衔肢,這里的尺寸庄岖、材質(zhì)、顏色都應(yīng)該被認(rèn)為是原語(yǔ)角骤。

這個(gè)痛點(diǎn)促使了Valhalla項(xiàng)目的誕生隅忿。

對(duì)象頭

為了理解Valhalla引入的 Value Object / ClassPrimitive Object / Class 概念能夠給我們帶來(lái)了什么,我們需要看看JVM是如何將對(duì)象保存在內(nèi)存中的邦尊。

對(duì)象頭對(duì)類的對(duì)象非常重要背桐,決定哪個(gè)線程可以訪問(wèn)對(duì)象、垃圾收集器標(biāo)記蝉揍、對(duì)象hash链峭;更重要的還有對(duì)象的類型指針,它能夠在運(yùn)行時(shí)動(dòng)態(tài)訪問(wèn)對(duì)象的類又沾,并從其類到該對(duì)象的詳細(xì)信息弊仪,比如繼承多態(tài)、反射捍掺。

但是凡事都有兩面性撼短,Java對(duì)象內(nèi)存占用的大小取決于它所包含的信息的總和,對(duì)象頭在 64 位系統(tǒng)上至少需要 16 個(gè)字節(jié)挺勿,在 32 位系統(tǒng)上至少需要 8 個(gè)字節(jié)(當(dāng)然JVM可以通過(guò)配置項(xiàng)去設(shè)置如何保存對(duì)象頭)蜓席。很多對(duì)象不需要多線程再榄,也不需要什么對(duì)象標(biāo)識(shí),就像上面提到的衣服的顏色,只有顏色的值才是我們關(guān)心的事昌执。這種冗余的內(nèi)存占用讓Java為人詬病。

Value Class

對(duì)于許多對(duì)象來(lái)說(shuō),它屬性值的相等性是我們關(guān)心的丧慈,其它類信息沒什么用馍迄,而且只為保存值和對(duì)這些值進(jìn)行操作而編寫的類在所有類中所占的比例非常大。Valhalla項(xiàng)目為這樣的場(chǎng)景引入了一個(gè)新的類類型:Value Class麦备。目前還只是JEP草案孽椰,但是已經(jīng)初具形態(tài):

value class Substring implements CharSequence {
    private String str;
    private int start;
    private int end;
    
    public Substring(String str, int start, int end) {
        checkBounds(start, end, str.length());
        this.str = str;
        this.start = start;
        this.end = end;
    }
    
    public int length() {
        return end - start;
    }
    
    public char charAt(int i) {
        checkBounds(0, i, length());
        return str.charAt(start + i);
    }
    
    public Substring subSequence(int s, int e) {
        checkBounds(s, e, length());
        return new Substring(str, start + s, start + e);
    }
    
    public String toString() {
        return str.substring(start, end);
    }
    
    private static void checkBounds(int start, int end, int length) {
        if (start < 0 || end < start || length < end)
            throw new IndexOutOfBoundsException();
    }
}

Value Class和我們常見的類差不多,但是它可能(這里依然在討論中)具有下面一些特性:

  • 值對(duì)象是沒有身份的對(duì)象凛篙,通常情況下我們用==運(yùn)算符檢查身份黍匾,這里可能和equals()不再有區(qū)別。

  • 值類本身和它的所有字段默認(rèn)都是final的呛梆。

  • 該類不直接或間接地實(shí)現(xiàn)java.lang.IdentityObject(有身份標(biāo)識(shí)類的新超類)锐涯。這意味著超類要么是無(wú)狀態(tài)抽象類,要么Object是無(wú)狀態(tài)抽象類填物。

  • 值類都是java.lang.ValueObject的隱式實(shí)現(xiàn)纹腌。

  • 沒有構(gòu)造super函數(shù)調(diào)用構(gòu)造函數(shù)霎终。將在不執(zhí)行任何超類初始化代碼的情況下創(chuàng)建實(shí)例。

  • 無(wú)法在值類中使用synchronized關(guān)鍵字升薯。

  • (可能)該類沒有聲明finalize()方法莱褒。

  • (可能)構(gòu)造函數(shù)不使用this來(lái)設(shè)置構(gòu)造函數(shù)主體中的字段,或者可能在所有字段都明確內(nèi)存分配之后覆劈。

其它的操作和普通的類應(yīng)該差別不大保礼,但是要注意的是,JDK標(biāo)準(zhǔn)庫(kù)中的一些原有類如果被認(rèn)定為Value Class需要做兼容性處理责语。

value要成為保留字還是關(guān)鍵字炮障?

這不是全部

Value Class對(duì)Java類對(duì)象頭進(jìn)行了閹割,有利于降低Java的內(nèi)存消耗坤候,但是這不是Valhalla計(jì)劃的全部胁赢。對(duì)于這一部分過(guò)于超前的內(nèi)容,我寫起來(lái)其實(shí)是很有困難的白筹,構(gòu)思了好幾天智末,從場(chǎng)景出發(fā)來(lái)了解一門編程語(yǔ)言的設(shè)計(jì)有利于從根本提高自己。如果你想了解更多關(guān)于Valhalla的東西徒河,可以關(guān)注我系馆,我會(huì)繼續(xù)分享相關(guān)的知識(shí)。

關(guān)注公眾號(hào):碼農(nóng)小胖哥顽照,獲取更多資訊

個(gè)人博客:https://felord.cn

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末由蘑,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子代兵,更是在濱河造成了極大的恐慌尼酿,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件植影,死亡現(xiàn)場(chǎng)離奇詭異裳擎,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)思币,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門鹿响,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人谷饿,你說(shuō)我怎么就攤上這事抢野。” “怎么了各墨?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)启涯。 經(jīng)常有香客問(wèn)我贬堵,道長(zhǎng)恃轩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任黎做,我火速辦了婚禮叉跛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蒸殿。我一直安慰自己筷厘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布宏所。 她就那樣靜靜地躺著酥艳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪爬骤。 梳的紋絲不亂的頭發(fā)上充石,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音霞玄,去河邊找鬼骤铃。 笑死,一個(gè)胖子當(dāng)著我的面吹牛坷剧,可吹牛的內(nèi)容都是我干的惰爬。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼惫企,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼撕瞧!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起雅任,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤风范,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后沪么,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體硼婿,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年禽车,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了寇漫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡殉摔,死狀恐怖州胳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情逸月,我是刑警寧澤栓撞,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響瓤湘,放射性物質(zhì)發(fā)生泄漏瓢颅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一弛说、第九天 我趴在偏房一處隱蔽的房頂上張望挽懦。 院中可真熱鬧,春花似錦木人、人聲如沸信柿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)渔嚷。三九已至,卻和暖如春淘讥,著一層夾襖步出監(jiān)牢的瞬間圃伶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工蒲列, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留窒朋,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓蝗岖,卻偏偏與公主長(zhǎng)得像侥猩,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子抵赢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容