JVM逃逸分析!!
時間:2021-10-18 16:13:15
手機看文章
掃描二維碼
隨時隨地手機看文章
[導讀]在JVM的實現(xiàn)中,為了提高JVM的性能和節(jié)省內(nèi)存空間,JVM提供了一種叫做“逃逸分析”的特性,而且對于“逃逸分析”這種特性,也是近年來大廠面試常問的知識點。今天,我們就一起來聊聊什么是逃逸分析。逃逸分析的概念先以官方的形式來說下什么是逃逸分析。逃逸分析就是:一種確定指針動態(tài)范圍的...
在JVM的實現(xiàn)中,為了提高JVM的性能和節(jié)省內(nèi)存空間,JVM提供了一種叫做 “逃逸分析” 的特性,而且對于“逃逸分析” 這種特性,也是近年來大廠面試常問的知識點。今天,我們就一起來聊聊什么是逃逸分析。
逃逸分析的概念
先以官方的形式來說下什么是逃逸分析。逃逸分析就是:一種確定指針動態(tài)范圍的靜態(tài)分析,它可以分析在程序的哪些地方可以訪問到指針。在JVM的即時編譯語境下,逃逸分析將判斷新建的對象是否逃逸。即時編譯判斷對象是否逃逸的依據(jù):一種是對象是否被存入堆中(靜態(tài)字段或者堆中對象的實例字段),另一種就是對象是否被傳入未知代碼。直接說這些概念,確實有點暈啊,那我們就來兩個示例。對象逃逸示例
一種典型的對象逃逸就是:對象被復制給成員變量或者靜態(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通過逃逸分析,能夠分析出新對象的使用范圍,從而決定新對象是否要在堆上進行分配。還沒完,我們繼續(xù)看下逃逸分析的優(yōu)點,以便于小伙伴們能夠更好的理解逃逸分析。