做個(gè)筆記,參開其他資料學(xué)習(xí)一下,以下純屬個(gè)人見解,如有錯誤之處,歡迎討論和糾正。
參考資料
JVM的逃逸分析
深入分析JVM逃逸分析對性能的影響
對象并不一定都是在堆上分配內(nèi)存的
在思考一個(gè)問題,在Java中,所有的對象都是分配在堆上嗎?
在jvm規(guī)范中,所有的對象都是分配上堆上面的。jvm規(guī)范是這么規(guī)定的,但是隨著JIT編譯技術(shù)的發(fā)展,具體的jvm實(shí)現(xiàn)存在一定的差異,會進(jìn)行一定的優(yōu)化。其中,就有通過“逃逸分析”技術(shù),Java Hotspot編譯器能夠分析出一個(gè)新的對象的引用的使用范圍從而決定是否要將這個(gè)對象分配到堆上。
在一些資料中,看到有這樣的理解。
因?yàn)镴ava本身的限制(對象只能分配到堆中),為了減少臨時(shí)對象在堆內(nèi)分配的數(shù)量,在一個(gè)方法體內(nèi)定義一個(gè)局部變量,并且該變量在方法執(zhí)行過程中未發(fā)生逃逸,按照J(rèn)VM調(diào)優(yōu)機(jī)制,首先會在堆內(nèi)存創(chuàng)建類的實(shí)例,然后將此對象的引用壓入調(diào)用棧,繼續(xù)執(zhí)行,這是JVM優(yōu)化前的方式。
采用逃逸分析對JVM進(jìn)行優(yōu)化。即針對棧的重新分配方式,首先找出未逃逸的變量,將該變量直接存到棧里,無需進(jìn)入堆,分配完成后,繼續(xù)調(diào)用棧內(nèi)執(zhí)行,最后線程執(zhí)行結(jié)束,??臻g被回收,局部變量也被回收了。如此操作,是優(yōu)化前在堆中,優(yōu)化后在棧中,從而減少了堆中對象的分配和銷毀,從而優(yōu)化性能。
上面幾篇都講的挺好的,這里就不多說啦。