java--JVM--栈帧--JVM及其优化---逃逸技术(堆栈分配方法)(转载)
對象逃逸的概念:對象能被其他線程以任何形式訪問
棧幀:
局部變量表:保存函數(shù)的參數(shù)以及局部變量用的,局部變量表中的變量只在當(dāng)前函數(shù)調(diào)用中有效,當(dāng)函數(shù)調(diào)用結(jié)束后,隨著函數(shù)棧幀的銷毀,局部變量表也會隨之銷毀。
操作數(shù)棧:主要用于保存計算過程的中間結(jié)果,同時作為計算過程中變量臨時的存儲空間。只支持出棧入棧操作。
幀數(shù)據(jù)區(qū):棧幀需要一些數(shù)據(jù)來支持常量池解析、正常方法返回和異常處理等。在幀數(shù)據(jù)區(qū)中保存著訪問常量池的指針,方便程序訪問常量池。
此外,當(dāng)函數(shù)返回或者出現(xiàn)異常時,虛擬機必須恢復(fù)調(diào)用者函數(shù)的棧幀,并讓調(diào)用者函數(shù)繼續(xù)執(zhí)行下去。
對于異常處理,虛擬機必須有一個異常處理表,方便在發(fā)生異常的時候找到處理異常的代碼,因此異常處理表也是幀數(shù)據(jù)區(qū)中重要的一部分
棧上分配:優(yōu)化技術(shù)
基本思想:
對于那些線程私有的對象,可以將它們打散分配在棧上,而不是分配在堆上。
分配在棧上的好處在于函數(shù)調(diào)用結(jié)束后可以自行銷毀,而不需要垃圾回收器的介入,從而提高系統(tǒng)的性能。
技術(shù)基礎(chǔ):逃逸分析
逃逸分析的目的是,判斷對象的作用域是否有可能逃逸出函數(shù)體
優(yōu)化配置:
運行使用參數(shù):-server -Xmx10m -Xms10m -XX:+DoEscapeAnalysis -XX:+PrintGC -XX:-UseTLAB -XX:+EliminateAllocations -server 在Server模式下,才可以啟用逃逸分析 -XX:+DoEscapeAnalysis 啟用逃逸分析技術(shù) -Xmx10m -Xms10m 指定堆空間最大為10MB,顯然,如果對象在堆上分配,必然會引起大量的GC -XX:+EliminateAllocations 開啟標(biāo)量替換(默認打開),允許對象打散分配在棧上,比如對象擁有id和name倆個字段,那么這倆個字段將會被視為倆個獨立的局部變量進行分配 -XX:-UseTLAB 關(guān)閉TLAB
說明棧上分配依賴逃逸分析和標(biāo)量替換的實現(xiàn)。
對于大量的零散小對象,棧上分配提供了一種很好的對象分配優(yōu)化策略,棧上分配速度快,并且可以有效避免垃圾回收帶來的負面影響。
但由于和堆空間相比,??臻g較小,因此對于大對象無法也不適合在棧上分配。
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的java--JVM--栈帧--JVM及其优化---逃逸技术(堆栈分配方法)(转载)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java-初识JVM的内存分配(5个区域
- 下一篇: 汇编-输出寄存器的值-输出值