日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

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


寫在前面

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

關(guān)于面試題

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

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

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

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

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

面試題答案

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

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

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

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

逃逸分析

逃逸分析的概念

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

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

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

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

對象逃逸示例

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

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

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

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

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

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

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

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

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

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

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

對象可能分配在棧上

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

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

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

同步鎖消除

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

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

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

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


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

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

在非易失性存儲器領(lǐng)域,EEPROM(電可擦除可編程只讀存儲器)曾長期占據(jù)主流地位,廣泛應(yīng)用于各類電子設(shè)備的參數(shù)存儲、日志記錄等場景。但隨著工業(yè)控制、汽車電子、醫(yī)療設(shè)備等領(lǐng)域?qū)Υ鎯π阅芴岢龈咭?,F(xiàn)RAM(鐵電隨機(jī)存取存...

關(guān)鍵字: 存儲器 可編程 嵌入式

康佳特將aReady.COM擴(kuò)展至Arm架構(gòu)模塊,基于恩智浦i.MX 95處理器打造應(yīng)用就緒的軟硬件構(gòu)建模塊,集成操作系統(tǒng)、系統(tǒng)整合與IoT連接能力,賦能高價(jià)值應(yīng)用快速落地

關(guān)鍵字: 處理器 IoT 嵌入式

3月12日,2026年中國家電及消費(fèi)電子博覽會(以下簡稱:AWE 2026)在上海盛大開幕。展會現(xiàn)場,場景化、系統(tǒng)化、一體化的家電解決方案成為行業(yè)焦點(diǎn),消費(fèi)者對家電的關(guān)注也已從基礎(chǔ)的尺寸匹配,延伸至對“空間秩序感”和“視...

關(guān)鍵字: 消費(fèi)電子 蒸烤箱 嵌入式

超高效NPU IP在資源受限設(shè)備中推進(jìn)邊緣AI,因而獲得認(rèn)可

關(guān)鍵字: 人工智能 嵌入式 NPU

上海2026年3月12日 /美通社/ -- 3月12日,2026中國家電及消費(fèi)電子博覽會(AWE 2026)在上海新國際博覽中心和東方樞紐國際商務(wù)合作區(qū)展區(qū)正式啟幕。本屆展會以"AI科技?慧享未來"為...

關(guān)鍵字: 西門子 博世 嵌入式 洗碗機(jī)

在“AI科技,慧享未來”的時(shí)代命題下,人工智能正加速滲透至家庭生活的每一個細(xì)節(jié)。2026年中國家電及消費(fèi)電子博覽會(AWE2026)在上海啟幕,聚焦AI技術(shù)如何重塑家電形態(tài)與人居體驗(yàn)。圍繞“智造不凡 悅享非凡”主題,西門...

關(guān)鍵字: 嵌入式 冰箱 AI

康佳特啟用客戶應(yīng)用中心,整合定制設(shè)計(jì)與軟件服務(wù),推出aReady.YOURS一站式解決方案

關(guān)鍵字: 嵌入式 物聯(lián)網(wǎng) 計(jì)算機(jī)模塊

在嵌入式系統(tǒng)開發(fā)領(lǐng)域,Qt憑借其跨平臺特性、豐富的GUI組件和高效的開發(fā)框架,成為構(gòu)建交互式界面的首選工具之一。對于嵌入式工程師而言,掌握Qt不僅能提升開發(fā)效率,更能為智能設(shè)備、工業(yè)控制、汽車電子等領(lǐng)域的產(chǎn)品帶來更優(yōu)質(zhì)的...

關(guān)鍵字: 嵌入式 QT

在人工智能加速滲透家庭生活的背景下,2026年中國家電及消費(fèi)電子博覽會(AWE2026)于上海新國際博覽中心盛大開幕。本屆AWE以“AI科技,慧享未來”為主題,集中呈現(xiàn)了前沿科技如何重新定義家電形態(tài)與人居空間。作為全球高...

關(guān)鍵字: 全屋智能 人工智能 嵌入式

2026 年 3 月 11 日,中國北京訊 - 全球先進(jìn)半導(dǎo)體解決方案供應(yīng)商瑞薩電子(TSE:6723)今日宣布,由Altium提供技術(shù)支持的智能模型化平臺“Renesas 365”正式全面上市:該平臺可將元器件與解決方...

關(guān)鍵字: 嵌入式 微控制器 元器件
關(guān)閉