成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

逃逸分析:分離對象、標(biāo)量替換、同步鎖消除

開發(fā) 前端
總體思路上,你可以這樣回答:Java中的對象不一定是在堆上分配的,因?yàn)镴VM通過逃逸分析,能夠分析出一個新對象的使用范圍,并以此確定是否要將這個對象分配到堆上。?

在JVM的實(shí)現(xiàn)中,為了提高JVM的性能和節(jié)省內(nèi)存空間,JVM提供了一種叫做“逃逸分析”的特性,而且對于“逃逸分析”這種特性,也是近年來大廠面試常問的知識點(diǎn)。今天,我們就一起來聊聊什么是逃逸分析。

逃逸分析的概念

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

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

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

對象逃逸示例

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

另一種典型的場景就是:對象通過return語句返回。如果對象通過return語句返回了,此時的程序并不能確定這個對象后續(xù)會不會被使用,外部的線程可以訪問到這個變量,此時對象也發(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)行分配。

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

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

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

圖片圖片

對象可能分配在棧上

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

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

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

同步鎖消除

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

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

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

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

衍生出的面試題

其實(shí),針對逃逸分析還會衍生出一些典型的面試題,例如:Java中的對象一定是在堆上分配的嗎? 只要我們充分掌握了逃逸分析的原理,回答這種面試題就非常簡單了。

關(guān)于面試題

Java中的對象一定是在堆上分配的嗎?

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

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

今天,我們介紹完什么是逃逸分析后,相信各位小伙伴就知道如何去完美的回答這道面試題了吧。

面試題解答思路

總體思路上,你可以這樣回答:Java中的對象不一定是在堆上分配的,因?yàn)镴VM通過逃逸分析,能夠分析出一個新對象的使用范圍,并以此確定是否要將這個對象分配到堆上。

責(zé)任編輯:武曉燕 來源: 冰河技術(shù)
相關(guān)推薦

2024-01-31 09:50:10

JVM逃逸分析HotSpot

2020-07-21 14:19:18

JVM編程語言

2025-04-11 08:42:10

Java對象TLAB

2024-04-07 11:33:02

Go逃逸分析

2021-10-14 10:22:19

逃逸JVM性能

2018-07-09 15:11:14

Java逃逸JVM

2023-01-10 09:18:37

Go內(nèi)存分配逃逸

2022-07-10 23:15:46

Go語言內(nèi)存

2024-12-17 07:41:34

Java逃逸分析

2023-01-28 08:32:04

Go內(nèi)存分配

2018-05-15 16:01:53

對象內(nèi)存JVM

2024-03-07 07:47:04

代碼塊Monitor

2022-11-30 08:19:15

內(nèi)存分配Go逃逸分析

2019-09-16 09:46:55

對抗反分析檢測逃逸惡意軟件

2019-09-16 09:46:55

2022-11-08 11:26:13

Go逃逸代碼

2023-12-22 07:55:38

Go語言分配策略

2019-09-11 15:49:02

入侵檢測反分析逃逸技術(shù)

2024-05-13 08:05:26

JVMJava逃逸分析

2010-07-12 14:15:01

ERP臨床信息系統(tǒng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 成人综合视频在线观看 | 国产高清区 | 国产成人一区 | av在线一区二区三区 | 欧美a∨ | 免费视频一区 | 免费观看的黄色网址 | 亚洲第一av | 精品1区2区| 我我色综合 | 国产久 | 久久国产成人 | 成年人视频在线免费观看 | 国产一级视频在线播放 | 午夜天堂精品久久久久 | 欧美一区二区在线看 | 国产精品1区2区3区 欧美 中文字幕 | 9久久婷婷国产综合精品性色 | 99爱视频 | 紧缚调教一区二区三区视频 | 国产午夜精品一区二区三区四区 | 男女网站免费 | 成人精品免费视频 | 91资源在线 | 日韩毛片在线视频 | 亚洲国产精品一区在线观看 | av在线免费不卡 | 亚洲精品456 | 狠狠涩| 国产精品爱久久久久久久 | 亚洲va国产日韩欧美精品色婷婷 | 黄色片大全在线观看 | 精品国产免费人成在线观看 | 久久久噜噜噜www成人网 | 欧美日韩一区精品 | 日日干夜夜操 | 久久久久久久91 | 青青久在线视频 | 3级毛片| 精品日韩一区二区 | 久久久综合精品 |