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

一篇學會逃逸分析,yyds!

云計算 虛擬化
在JVM的實現中,為了提高JVM的性能和節省內存空間,JVM提供了一種叫做 “逃逸分析” 的特性,而且對于“逃逸分析” 這種特性,也是近年來大廠面試常問的知識點。

[[428823]]

大家好,我是冰河~~

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

逃逸分析的概念

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

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

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

對象逃逸示例

一種典型的對象逃逸就是:對象被復制給成員變量或者靜態變量,可能被外部使用,此時變量就發生了逃逸。

我們可以用下面的代碼來表示這個現象。

  1. /** 
  2.  * @author binghe 
  3.  * @description 對象逃逸示例1 
  4.  */ 
  5. public class ObjectEscape{ 
  6.     private User user
  7.     public void init(){ 
  8.         user = new User(); 
  9.     } 

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

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

我們可以用下面的代碼來表示這個現象。

  1. /** 
  2.  * @author binghe 
  3.  * @description 對象逃逸示例2 
  4.  */ 
  5. public class ObjectReturn{ 
  6.     public User createUser(){ 
  7.         User user = new User(); 
  8.         return user
  9.     } 

給出兩個示例,相信小伙伴們對JVM的逃逸分析多少有點了解了吧,沒錯,JVM通過逃逸分析,能夠分析出新對象的使用范圍,從而決定新對象是否要在堆上進行分配。

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

逃逸分析的優點

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

對象可能分配在棧上

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

分離對象或標量替換

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

同步鎖消除

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

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

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

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

衍生出的面試題

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

關于面試題

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

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

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

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

面試題解答思路

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

好了,今天就到這兒吧,我是冰河,我們下期見~~

本文轉載自微信公眾號「冰河技術」,可以通過以下二維碼關注。轉載本文請聯系冰河技術公眾號。

 

責任編輯:武曉燕 來源: 冰河技術
相關推薦

2021-12-01 06:59:27

Linux發行版Manjaro

2022-01-02 08:43:46

Python

2022-02-07 11:01:23

ZooKeeper

2021-07-12 22:50:29

Caffeine數據結構

2022-06-08 11:39:29

經營分析指標

2021-07-02 09:45:29

MySQL InnoDB數據

2021-07-06 08:59:18

抽象工廠模式

2023-01-03 08:31:54

Spring讀取器配置

2021-07-05 22:11:38

MySQL體系架構

2023-11-28 08:29:31

Rust內存布局

2022-08-26 09:29:01

Kubernetes策略Master

2021-05-11 08:54:59

建造者模式設計

2022-08-23 08:00:59

磁盤性能網絡

2021-09-28 08:59:30

復原IP地址

2022-04-12 08:30:52

回調函數代碼調試

2021-10-27 09:59:35

存儲

2021-07-16 22:43:10

Go并發Golang

2023-03-13 21:38:08

TCP數據IP地址

2023-11-01 09:07:01

Spring裝配源碼

2022-10-20 07:39:26

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩成人在线一区 | 久久精品国产99国产 | 成人福利在线观看 | 日本黄色大片免费看 | 国产视频2021 | 成人午夜在线 | 黄色毛片在线播放 | 在线免费黄色小视频 | 可以免费观看的av片 | 国产三级 | 最新国产视频 | 国产剧情一区 | 中文字幕在线观看成人 | 国产一级在线 | 成人影| 精品国产一区二区 | 日本午夜免费福利视频 | 91久久久久久 | 国产精品久久久久aaaa九色 | 欧美日韩综合一区 | 波多野结衣二区 | 在线免费观看黄a | 亚洲欧美中文日韩在线v日本 | 国产一区二区电影 | 一区二区三区四区不卡 | 人人九九精 | 特一级毛片 | 紧缚调教一区二区三区视频 | 国产91在线播放 | 日日干天天干 | 日韩精品一区二区三区高清免费 | 亚洲免费av一区 | 午夜精品久久久 | 欧美一区二区三区在线观看 | 日韩欧美视频在线 | 成人影| 国产美女一区 | 国产视频中文字幕 | 在线观看av不卡 | 亚洲国产精品日韩av不卡在线 | 国产丝袜av |