反射的性能開銷都在哪

1.反射調(diào)用過程中會(huì)產(chǎn)生大量的臨時(shí)對象,這些對象會(huì)占用內(nèi)存,可能會(huì)導(dǎo)致頻繁 gc,從而影響性能。
2.反射調(diào)用方法時(shí)會(huì)從方法數(shù)組中遍歷查找,并且會(huì)檢查可見性等操作會(huì)耗時(shí)。
3.反射在達(dá)到一定次數(shù)時(shí),會(huì)動(dòng)態(tài)編寫字節(jié)碼并加載到內(nèi)存中,這個(gè)字節(jié)碼沒有經(jīng)過編譯器優(yōu)化,也不能享受JIT優(yōu)化。
4.Method#invoke 方法會(huì)對參數(shù)做封裝和解封操作,會(huì)涉及自動(dòng)裝箱/拆箱和類型轉(zhuǎn)換,都會(huì)帶來一定的資源開銷。
5.反射方法難以內(nèi)聯(lián)
6.需要檢查方法可見性和校驗(yàn)參數(shù)

invoke 方法的參數(shù)是一個(gè)可變長參數(shù),也就是構(gòu)建一個(gè) Object 數(shù)組存參數(shù),這也同時(shí)帶來了基本數(shù)據(jù)類型的裝箱操作,在 invoke 內(nèi)部會(huì)進(jìn)行運(yùn)行時(shí)權(quán)限檢查,這也是一個(gè)損耗點(diǎn)。普通方法調(diào)用可能有一系列優(yōu)化手段,比如方法內(nèi)聯(lián)、逃逸分析,而這又是反射調(diào)用所不能做的,性能差距再一次被放大。
優(yōu)化反射調(diào)用,可以盡量避免反射調(diào)用虛方法、關(guān)閉運(yùn)行時(shí)權(quán)限檢查、可能需要增大基本數(shù)據(jù)類型對應(yīng)的包裝類緩存、如果調(diào)用次數(shù)可知可以關(guān)閉 Inflation 機(jī)制,以及增加內(nèi)聯(lián)緩存記錄的類型數(shù)目。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容