目錄
- 一、說明
- 二、逃逸分析
- 2.1 說明
- 2.2 參數設置
一、說明
- 1.在《深入理解Java虛擬機》中關于Java堆內存有這樣一段描述:隨著JIT編譯期的發展與逃逸分析技術逐漸成熟,棧上分配、標量替換優化技術將會導致一些微妙的變化,所有的對象都分配到堆上也漸漸變得不那么“絕對”了。
- 2.在Java虛擬機中,對象是在Java堆中分配內存的,這是一個普遍的常識。但是,有一種特殊情況,那就是如果經過逃逸分析(Escape Analysis)后發現,一個對象并沒有逃逸出方法的話,那么就可能被優化成棧上分配。i這樣就無需在堆上分配內存,也無須進行垃圾回收了。這也是最常見的堆外存儲技術。
- 3.此外,基于openJDK深度定制的TaoBaoVM,其中創新的GCIH (GCinvisible heap)技術實現off-heap,將生命周期較長的Java對象從heap中移至heap外,并且GC不能管理GCIH內部的Java對象,以此達到降低GC的回收頻率和提升GC的回收效率的目的。
二、逃逸分析
2.1 說明
- 1.如何將堆上的對象分配到棧,需要使用逃逸分析手段。
- 2.這是一種可以有效減少Java 程序中同步負載和內存堆分配壓力的跨函數全局數據流分析算法。
- 3.通過逃逸分析,Java Hotspot編譯器能夠分析出一個新的對象的引用的使用范圍從而決定是否要將這個對象分配到堆上。
- 4.逃逸分析的基本行為就是分析對象動態作用域:當一個對象在方法中被定義后,對象只在方法內部使用,則認為沒有發生逃逸。當一個對象在方法中被定義后,它被外部方法所引用,則認為發生逃逸。例如作為調用參數傳遞到其他地方中。
2.2 參數設置
- 1.在JDK 6u23版本之后,HotSpot中默認就已經開啟了逃逸分析。
- 2.如果使用的是較早的版本,開發人員則可以:
通過選項“-XX: +DoEscapeAnalysis”顯式開啟逃逸分析
通過選項“-XX: +PrintEscapeAnalysis”查看逃逸分析的篩選結果。