<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ### 棧上分配 故名思議就是在棧上分配對象,棧上分配主要是指在Java程序的執行過程中,在方法體中聲明的變量以及創建的對象,將直接從該線程所使用的棧中分配空間。 一般而言,創建對象都是從堆中來分配的,這里是指在棧上來分配空間給新創建的對象;其實目前Hotspot并沒有實現真正意義上的棧上分配,實際上是標量替換。 棧上分配的好處一方面更加快速,另一方面是方法結束時對象也被回收了 ``` private static int fn(int age) { User user = new User(age); int i = user.getAge(); return i; } ``` User對象的作用域局限在方法fn中,可以使用標量替換的優化手段在棧上分配對象的成員變量,這樣就不會生成User對象,大大減輕GC的壓力,下面通過例子看看逃逸分析的影響。 ``` public class JVM { public static void main(String[] args) throws Exception { int sum = 0; int count = 1000000; //warm up for (int i = 0; i < count ; i++) { sum += fn(i); } Thread.sleep(500); for (int i = 0; i < count ; i++) { sum += fn(i); } System.out.println(sum); System.in.read(); } private static int fn(int age) { User user = new User(age); int i = user.getAge(); return i; } } class User { private final int age; public User(int age) { this.age = age; } public int getAge() { return age; } } ``` 分層編譯和逃逸分析在1.8中是默認是開啟的,例子中fn方法被執行了200w次,按理說應該在Java堆生成200w個User對象 1、通過java -cp . -Xmx3G -Xmn2G -server -XX:-DoEscapeAnalysis JVM運行代碼,-XX:-DoEscapeAnalysis關閉逃逸分析,通過jps查看java進程的PID,接著通過jmap -histo \[pid\]查看java堆上的對象分布情況,結果如下: ![](https://img.kancloud.cn/4b/8b/4b8badda0b33c65b1567a4133371f034_496x419.png) 可以發現:關閉逃逸分析之后,User對象一個不少的都在堆上進行分配 2、通過 ``` java -cp . -Xmx3G -Xmn2G -server JVM ``` 運行代碼,結果如下: ![](https://img.kancloud.cn/cc/4f/cc4f471d2baf8b2135ced50748e23263_501x435.png) 可以發現:開啟逃逸分析之后,只有41w左右的User對象在Java堆上分配,其余的對象已經通過標量替換優化了。 3、通過 ``` java -cp . -Xmx3G -Xmn2G -server -XX:-TieredCompilation ``` 運行代碼,關閉分層編譯,結果如下 ![](https://img.kancloud.cn/80/65/8065b568f09985f76b8a3f61bd028114_508x418.png) 可以發現:關閉了分層編譯之后,在Java堆上分配的User對象降低到1w多個,分層編譯對逃逸分析還是有影響的
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看