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

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


寫在前面

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

關于面試題

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

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

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

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

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

面試題答案

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

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

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

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

逃逸分析

逃逸分析的概念

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

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

直接說這些概念,確實有點暈啊,那我們就來兩個示例。

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

對象逃逸示例

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

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

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

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

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

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

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

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

對象可能分配在棧上

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

分離對象或標量替換

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

同步鎖消除

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

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

要開啟同步消除,需要加上 -XX:+EliminateLocks 參數(shù)。因為這個參數(shù)依賴逃逸分析,所以同時要打開 -XX:+DoEscapeAnalysis 選項。

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


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

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

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅(qū)動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅(qū)動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅(qū)動性能的關鍵。

關鍵字: 工業(yè)電機 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅(qū)動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質(zhì)量和效率直接關系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅(qū)動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關鍵字: LED 驅(qū)動電源 開關電源

LED驅(qū)動電源是把電源供應轉換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅(qū)動電源
關閉