www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > 架構(gòu)師社區(qū)
[導(dǎo)讀]從開(kāi)始學(xué)習(xí)Java的時(shí)候,我們就接觸了這樣一種觀點(diǎn):Java中的對(duì)象是在堆上創(chuàng)建的,對(duì)象的引用是放在棧里的,那這個(gè)觀點(diǎn)就真的是正確的嗎?如果是正確的,那么,面試官為啥會(huì)問(wèn):“Java中的對(duì)象就一定是在堆上分配的嗎?”這個(gè)問(wèn)題呢?看來(lái),我們從接觸Java就被灌輸?shù)倪@個(gè)觀點(diǎn)值得我們懷疑。


寫(xiě)在前面

從開(kāi)始學(xué)習(xí)Java的時(shí)候,我們就接觸了這樣一種觀點(diǎn):Java中的對(duì)象是在堆上創(chuàng)建的,對(duì)象的引用是放在棧里的,那這個(gè)觀點(diǎn)就真的是正確的嗎?如果是正確的,那么,面試官為啥會(huì)問(wèn):“Java中的對(duì)象就一定是在堆上分配的嗎?”這個(gè)問(wèn)題呢?看來(lái),我們從接觸Java就被灌輸?shù)倪@個(gè)觀點(diǎn)值得我們懷疑。

關(guān)于面試題

標(biāo)題中的面試題為:Java中的對(duì)象和數(shù)組都是在堆上分配的嗎?

面試官這樣問(wèn),有些小伙伴心里會(huì)想:我從一開(kāi)始學(xué)習(xí)Java時(shí),就知道了:Java中的對(duì)象是在堆上創(chuàng)建的,對(duì)象的引用是存儲(chǔ)到棧中的,那Java中的對(duì)象和數(shù)組肯定是在堆上分配的??!難道不是嗎?

性能優(yōu)化:Java中的對(duì)象和數(shù)組都是在堆上分配的嗎?

如果你這樣回答,就會(huì)被直接Pass掉。

或許有些小伙伴還是不太明白,那我們繼續(xù)往下看。

面試題答案

首先,我們先給出這個(gè)題目的答案,這里我先簡(jiǎn)短的回答下這個(gè)面試題,后續(xù)我們會(huì)進(jìn)行相關(guān)分析。

你可以這樣回答:Java中的對(duì)象不一定是在堆上分配的,因?yàn)镴VM通過(guò)逃逸分析,能夠分析出一個(gè)新對(duì)象的使用范圍,并以此確定是否要將這個(gè)對(duì)象分配到堆上。如果JVM發(fā)現(xiàn)某些對(duì)象沒(méi)有逃逸出方法,就很有可能被優(yōu)化成在棧上分配。

這里,我們接觸了一個(gè)新名詞:逃逸分析。相信很多小伙伴不是很明白,那我們繼續(xù)往下看。

性能優(yōu)化:Java中的對(duì)象和數(shù)組都是在堆上分配的嗎?

逃逸分析

逃逸分析的概念

先以官方的形式來(lái)說(shuō)下什么是逃逸分析。逃逸分析就是:一種確定指針動(dòng)態(tài)范圍的靜態(tài)分析,它可以分析在程序的哪些地方可以訪問(wèn)到指針。

在JVM的即時(shí)編譯語(yǔ)境下,逃逸分析將判斷新建的對(duì)象是否逃逸。即時(shí)編譯判斷對(duì)象是否逃逸的依據(jù):一種是對(duì)象是否被存入堆中(靜態(tài)字段或者堆中對(duì)象的實(shí)例字段),另一種就是對(duì)象是否被傳入未知代碼。

直接說(shuō)這些概念,確實(shí)有點(diǎn)暈啊,那我們就來(lái)兩個(gè)示例。

性能優(yōu)化:Java中的對(duì)象和數(shù)組都是在堆上分配的嗎?

對(duì)象逃逸示例

一種典型的對(duì)象逃逸就是:對(duì)象被復(fù)制給成員變量或者靜態(tài)變量,可能被外部使用,此時(shí)變量就發(fā)生了逃逸。

我們可以用下面的代碼來(lái)表示這個(gè)現(xiàn)象。

/**
?* @author binghe
?* @description 對(duì)象逃逸示例1
?*/ public class ObjectEscape{ private User?user; public void init(){
????????user?= new User();
????}
}

在ObjectEscape類中,存在一個(gè)成員變量user,我們?cè)趇nit()方法中,創(chuàng)建了一個(gè)User類的對(duì)象,并將其賦值給成員變量user。此時(shí),對(duì)象被復(fù)制給了成員變量,可能被外部使用,此時(shí)的變量就發(fā)生了逃逸。

另一種典型的場(chǎng)景就是:對(duì)象通過(guò)return語(yǔ)句返回。如果對(duì)象通過(guò)return語(yǔ)句返回了,此時(shí)的程序并不能確定這個(gè)對(duì)象后續(xù)會(huì)不會(huì)被使用,外部的線程可以訪問(wèn)到這個(gè)變量,此時(shí)對(duì)象也發(fā)生了逃逸。

我們可以用下面的代碼來(lái)表示這個(gè)現(xiàn)象。

/**
?* @author binghe
?* @description 對(duì)象逃逸示例2
?*/ public class ObjectReturn{ public User createUser(){
????????User?user?= new User(); return user;
????}
}

給出兩個(gè)示例,相信小伙伴們對(duì)JVM的逃逸分析多少有點(diǎn)了解了吧,沒(méi)錯(cuò),JVM通過(guò)逃逸分析,能夠分析出新對(duì)象的使用范圍,從而決定新對(duì)象是否要在堆上進(jìn)行分配。性能優(yōu)化:Java中的對(duì)象和數(shù)組都是在堆上分配的嗎?

還沒(méi)完,我們繼續(xù)看下逃逸分析的優(yōu)點(diǎn),以便于小伙伴們能夠更好的理解逃逸分析。

逃逸分析的優(yōu)點(diǎn)

逃逸分析的優(yōu)點(diǎn)總體上來(lái)說(shuō)可以分為三個(gè):對(duì)象可能分配在棧上、分離對(duì)象或標(biāo)量替換、消除同步鎖。我們可以使用下圖來(lái)表示。性能優(yōu)化:Java中的對(duì)象和數(shù)組都是在堆上分配的嗎?

對(duì)象可能分配在棧上

JVM通過(guò)逃逸分析,分析出新對(duì)象的使用范圍,就可能將對(duì)象在棧上進(jìn)行分配。棧分配可以快速地在棧幀上創(chuàng)建和銷毀對(duì)象,不用再將對(duì)象分配到堆空間,可以有效地減少 JVM 垃圾回收的壓力。

分離對(duì)象或標(biāo)量替換

當(dāng)JVM通過(guò)逃逸分析,確定要將對(duì)象分配到棧上時(shí),即時(shí)編譯可以將對(duì)象打散,將對(duì)象替換為一個(gè)個(gè)很小的局部變量,我們將這個(gè)打散的過(guò)程叫做標(biāo)量替換。將對(duì)象替換為一個(gè)個(gè)局部變量后,就可以非常方便的在棧上進(jìn)行分配了。

同步鎖消除

如果JVM通過(guò)逃逸分析,發(fā)現(xiàn)一個(gè)對(duì)象只能從一個(gè)線程被訪問(wèn)到,則訪問(wèn)這個(gè)對(duì)象時(shí),可以不加同步鎖。如果程序中使用了synchronized鎖,則JVM會(huì)將synchronized鎖消除。

這里,需要注意的是:這種情況針對(duì)的是synchronized鎖,而對(duì)于Lock鎖,則JVM并不能消除。

要開(kāi)啟同步消除,需要加上 -XX:+EliminateLocks 參數(shù)。因?yàn)檫@個(gè)參數(shù)依賴逃逸分析,所以同時(shí)要打開(kāi) -XX:+DoEscapeAnalysis 選項(xiàng)。

所以,并不是所有的對(duì)象和數(shù)組,都是在堆上進(jìn)行分配的,由于即時(shí)編譯的存在,如果JVM發(fā)現(xiàn)某些對(duì)象沒(méi)有逃逸出方法,就很有可能被優(yōu)化成在棧上分配。


免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉