做個(gè)筆記掂僵,參開其他資料學(xué)習(xí)一下包晰,以下純屬個(gè)人見解齐邦,如有錯(cuò)誤之處,歡迎討論和糾正憔四。
參考資料
JVM的逃逸分析
深入分析JVM逃逸分析對(duì)性能的影響
對(duì)象并不一定都是在堆上分配內(nèi)存的
在思考一個(gè)問題膀息,在Java
中,所有的對(duì)象都是分配在堆上嗎了赵?
在jvm規(guī)范
中潜支,所有的對(duì)象都是分配上堆上面的。jvm規(guī)范
是這么規(guī)定的柿汛,但是隨著JIT
編譯技術(shù)的發(fā)展冗酿,具體的jvm
實(shí)現(xiàn)存在一定的差異,會(huì)進(jìn)行一定的優(yōu)化络断。其中裁替,就有通過“逃逸分析”技術(shù),Java Hotspot
編譯器能夠分析出一個(gè)新的對(duì)象的引用的使用范圍從而決定是否要將這個(gè)對(duì)象分配到堆上貌笨。
在一些資料中弱判,看到有這樣的理解。
因?yàn)镴ava本身的限制(對(duì)象只能分配到堆中)锥惋,為了減少臨時(shí)對(duì)象在堆內(nèi)分配的數(shù)量昌腰,在一個(gè)方法體內(nèi)定義一個(gè)局部變量开伏,并且該變量在方法執(zhí)行過程中未發(fā)生逃逸,按照J(rèn)VM調(diào)優(yōu)機(jī)制剥哑,首先會(huì)在堆內(nèi)存創(chuàng)建類的實(shí)例硅则,然后將此對(duì)象的引用壓入調(diào)用棧,繼續(xù)執(zhí)行株婴,這是JVM優(yōu)化前的方式怎虫。
采用逃逸分析對(duì)JVM進(jìn)行優(yōu)化。即針對(duì)棧的重新分配方式困介,首先找出未逃逸的變量大审,將該變量直接存到棧里,無需進(jìn)入堆座哩,分配完成后徒扶,繼續(xù)調(diào)用棧內(nèi)執(zhí)行,最后線程執(zhí)行結(jié)束根穷,椊猓空間被回收,局部變量也被回收了屿良。如此操作圈澈,是優(yōu)化前在堆中,優(yōu)化后在棧中尘惧,從而減少了堆中對(duì)象的分配和銷毀康栈,從而優(yōu)化性能。
上面幾篇都講的挺好的喷橙,這里就不多說啦啥么。