1、前言知識鋪墊數組
一、逃逸對象:在一個方法內建立的對象沒有被外界引用則稱該對象爲未逃逸的對象。多線程
二、JDK1.6之後的HotSpot虛擬機支持運行時的對象逃逸分析。性能
三、JVM中的參數配置:spa
1 1)-XX:+PrintFlagsInitial --查看JVM中的默認參數信息 2 3 2)--XX:+DoEscapeAnalysis --開啓對象的逃逸分析(JDK8中默認開啓) 4 5 3)--XX:-DoEscapeAnalysis --關閉對象的逃逸分析 6 7 4)-XX:+PrintGC --輸出GC的基本信息 8 9 5)-XX:+PrintGCDetails --輸出GC的詳細信息 10 11 6)-Xmx5m/-Xms5m --最大/最小堆配置
2、對象建立時的內存分配線程
一、對象建立時有可能分配在堆上也有可能分配在棧上。設計
二、方法內部建立的小對象而且沒有逃逸可能分配在棧上。code
三、JDK8默認打開逃逸分析,對JVM的執行會有性能上的提升。對象
4、設計對象時,假如對象不會被多線程共享,多個方法共享,此時,對象的引用應該儘可能使用局部變量。blog
3、逃逸分析的開啓與關閉對JVM執行性能的影響內存
首先,咱們先來看一個實例。
1 public class TestObjectInstance01 { 2 public static void main(String[] args) { 3 long start = System.currentTimeMillis(); 4 for (int i = 0; i < 100000000; i++) { 5 //調用alloc()方法 6 alloc(); 7 } 8 long end = System.currentTimeMillis(); 9 System.out.println("運行時間:"+(end-start)); 10 } 11 12 private static void alloc() { 13 //建立一個只能存儲一個字節的數組對象 14 byte[] arr = new byte[1]; 15 arr[0] = 10; 16 } 17 }
咱們配置了JVM的最大/最小堆參數,並開啓了逃逸分析:
-Xmx5m -Xms5m -XX:+DoEscapeAnalysis -XX:+PrintGC
運行結果:
接着咱們又關閉了逃逸分析:
-Xmx5m -Xms5m -XX:-DoEscapeAnalysis -XX:+PrintGC
運行結果:
結果分析:
咱們能夠看到,開啓逃逸分析時,JVM的運行性能要遠高於未開啓時。由於棧上分配的對象不須要啓動GC來進行回收,當調用的方法出棧時,該對象會自動銷燬。