Java 虛擬機逃逸分析

   首先先說下爲什麼需要了解要逃逸分析,在哪裏用到。
    Java堆區是一塊用於存儲對象實例的內存區,同時也是gc執行垃圾回收的重點區域。所以這也造成gc可能會在大內存的使用和

頻繁進行垃圾回收過程上成爲系統性能瓶頸。爲了解決這個問題,jvn設計者開始考慮把對象實例存儲到Java堆區外。使用GCIH技術,即將生命週期長的Java對象從heap中移動到heap外,並且gc不能管理GCIH內部的對象。因此達到降低GC的回收頻率和提升GC的回收效率的目的。
  而另一種方法,就是逃逸分析了。它也是降低GC的回收頻率和提升GC的回收效率的有效方式。

  逃逸分析(Escape Analysis)是目前Java虛擬機中比較前沿的優化技術。

  逃逸分析的基本行爲就是分析對象動態作用域:當一個對象在方法中被定義後,它可能被外部方法所引用,例如作爲調用參數傳遞到其他地方中,稱爲方法逃逸。

例如:

1
2
3
4
5
6
public static StringBuffer craeteStringBuffer(String s1, String s2) {
        StringBuffer sb = new StringBuffer();
        sb.append(s1);
        sb.append(s2);
        return sb;
    }

StringBuffer sb是一個方法內部變量,上述代碼中直接將sb返回,這樣這個StringBuffer有可能被其他方法所改變,這樣它的作用域就不只是在方法內部,雖然它是一個局部變量,稱其逃逸到了方法外部。

甚至還有可能被外部線程訪問到,譬如賦值給類變量或可以在其他線程中訪問的實例變量,稱爲線程逃逸。

上述代碼如果想要StringBuffer sb不逃出方法,可以這樣寫:

1
2
3
4
5
6
public static String createStringBuffer(String s1, String s2) {
        StringBuffer sb = new StringBuffer();
        sb.append(s1);
        sb.append(s2);
        return sb.toString();
    }

不直接返回 StringBuffer,那麼StringBuffer將不會逃逸出方法。

參考:http://www.importnew.com/23150.html



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章