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