日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

最近一周,十人面試,十人全掛在這個問題上!

來源: 責編: 時間:2024-05-16 09:09:44 161觀看
導讀從開始學習Java的時候,我們就接觸了這樣一種觀點:Java中的對象是在堆上創(chuàng)建的,對象的引用是放在棧里的,這個觀點真的是正確的嗎?關于面試題面試題:Java中的對象是在堆上分配的嗎?有些小伙伴心里會想:我從一開始學習Java時,就知

m8R28資訊網(wǎng)——每日最新資訊28at.com

從開始學習Java的時候,我們就接觸了這樣一種觀點:Java中的對象是在堆上創(chuàng)建的,對象的引用是放在棧里的,這個觀點真的是正確的嗎?m8R28資訊網(wǎng)——每日最新資訊28at.com

關于面試題

面試題:Java中的對象是在堆上分配的嗎?m8R28資訊網(wǎng)——每日最新資訊28at.com

有些小伙伴心里會想:我從一開始學習Java時,就知道了:Java中的對象是在堆上創(chuàng)建的,對象的引用是存儲到棧中的,那Java中的對象是在堆上分配的啊!難道不是嗎?m8R28資訊網(wǎng)——每日最新資訊28at.com

如果你這樣回答,就會被直接Pass掉。m8R28資訊網(wǎng)——每日最新資訊28at.com

或許有些小伙伴還是不太明白,那我們繼續(xù)往下看。m8R28資訊網(wǎng)——每日最新資訊28at.com

面試題答案

首先,我們先給出這個題目的答案,這里我先簡短的回答下這個面試題,后續(xù)我們會進行相關分析。m8R28資訊網(wǎng)——每日最新資訊28at.com

你可以這樣回答:Java中的對象不一定是在堆上分配的,因為JVM通過逃逸分析,能夠分析出一個新對象的使用范圍,并以此確定是否要將這個對象分配到堆上。m8R28資訊網(wǎng)——每日最新資訊28at.com

這里,我們接觸了一個新名詞:逃逸分析。相信很多小伙伴不是很明白,那我們繼續(xù)往下看。m8R28資訊網(wǎng)——每日最新資訊28at.com

逃逸分析的概念

先以官方的形式來說下什么是逃逸分析。逃逸分析就是:一種確定指針動態(tài)范圍的靜態(tài)分析,它可以分析在程序的哪些地方可以訪問到指針。m8R28資訊網(wǎng)——每日最新資訊28at.com

在JVM的即時編譯語境下,逃逸分析將判斷新建的對象是否逃逸。即時編譯判斷對象是否逃逸的依據(jù):一種是對象是否被存入堆中(靜態(tài)字段或者堆中對象的實例字段),另一種就是對象是否被傳入未知代碼。m8R28資訊網(wǎng)——每日最新資訊28at.com

直接說這些概念,確實有點暈啊,那我們就來兩個示例。m8R28資訊網(wǎng)——每日最新資訊28at.com

對象逃逸示例

一種典型的對象逃逸就是:對象被復制給成員變量或者靜態(tài)變量,可能被外部使用,此時變量就發(fā)生了逃逸。m8R28資訊網(wǎng)——每日最新資訊28at.com

我們可以用下面的代碼來表示這個現(xiàn)象。m8R28資訊網(wǎng)——每日最新資訊28at.com

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

在ObjectEscape類中,存在一個成員變量user,我們在init()方法中,創(chuàng)建了一個User類的對象,并將其賦值給成員變量user。此時,對象被復制給了成員變量,可能被外部使用,此時的變量就發(fā)生了逃逸。m8R28資訊網(wǎng)——每日最新資訊28at.com

另一種典型的場景就是:對象通過return語句返回。如果對象通過return語句返回了,此時的程序并不能確定這個對象后續(xù)會不會被使用,外部的線程可以訪問到這個變量,此時對象也發(fā)生了逃逸。m8R28資訊網(wǎng)——每日最新資訊28at.com

我們可以用下面的代碼來表示這個現(xiàn)象。m8R28資訊網(wǎng)——每日最新資訊28at.com

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

給出兩個示例,相信小伙伴們對JVM的逃逸分析多少有點了解了吧,沒錯,JVM通過逃逸分析,能夠分析出新對象的使用范圍,從而決定新對象是否要在堆上進行分配。m8R28資訊網(wǎng)——每日最新資訊28at.com

還沒完,我們繼續(xù)看下逃逸分析的優(yōu)點,以便于小伙伴們能夠更好的理解逃逸分析。m8R28資訊網(wǎng)——每日最新資訊28at.com

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

逃逸分析的優(yōu)點總體上來說可以分為三個:對象可能分配在棧上、分離對象或標量替換、消除同步鎖。我們可以使用下圖來表示。m8R28資訊網(wǎng)——每日最新資訊28at.com

圖片m8R28資訊網(wǎng)——每日最新資訊28at.com

對象可能分配在棧上

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

分離對象或標量替換

當JVM通過逃逸分析,確定要將對象分配到棧上時,即時編譯可以將對象打散,將對象替換為一個個很小的局部變量,我們將這個打散的過程叫做標量替換。將對象替換為一個個局部變量后,就可以非常方便的在棧上進行分配了。m8R28資訊網(wǎng)——每日最新資訊28at.com

同步鎖消除

如果JVM通過逃逸分析,發(fā)現(xiàn)一個對象只能從一個線程被訪問到,則訪問這個對象時,可以不加同步鎖。如果程序中使用了synchronized鎖,則JVM會將synchronized鎖消除。m8R28資訊網(wǎng)——每日最新資訊28at.com

這里,需要注意的是:這種情況針對的是synchronized鎖,而對于Lock鎖,則JVM并不能消除。m8R28資訊網(wǎng)——每日最新資訊28at.com

要開啟同步消除,需要加上 -XX:+EliminateLocks 參數(shù)。因為這個參數(shù)依賴逃逸分析,所以同時要打開 -XX:+DoEscapeAnalysis 選項。m8R28資訊網(wǎng)——每日最新資訊28at.com

所以,并不是所有的對象和數(shù)組,都是在堆上進行分配的,由于即時編譯的存在,如果JVM發(fā)現(xiàn)某些對象沒有逃逸出方法,就很有可能被優(yōu)化成在棧上分配。m8R28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-88381-0.html最近一周,十人面試,十人全掛在這個問題上!

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: SpringBoot3.x 和 WebSocket 在物聯(lián)網(wǎng)設備管理中的應用

下一篇: 聊聊Vue.js 基礎語法詳解

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 分宜县| 台州市| 普格县| 尼勒克县| 农安县| 漳州市| 应城市| 修武县| 乌海市| 浦东新区| 友谊县| 杂多县| 武鸣县| 开封县| 博野县| 清新县| 吉安县| 银川市| 永川市| 盐边县| 双鸭山市| 滨州市| 清苑县| 麻栗坡县| 营山县| 崇阳县| 乡城县| 莱阳市| 肃北| 玉林市| 鄂州市| 太康县| 柯坪县| 洛南县| 永安市| 佛冈县| 兴安县| 深圳市| 扶绥县| 定州市| 通海县|