国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - JAVA教程 - Java逃逸分析詳解及代碼示例

Java逃逸分析詳解及代碼示例

2021-02-02 11:58StormMa JAVA教程

這篇文章主要介紹了Java逃逸分析詳解及代碼示例,具有一定參考價值,需要的朋友可以了解下。

概念引入

我們都知道,Java 創建的對象都是被分配到堆內存上,但是事實并不是這么絕對,通過對Java對象分配的過程分析,可以知道有兩個地方會導致Java中創建出來的對象并一定分別在所認為的堆上。這兩個點分別是Java中的逃逸分析和TLAB(Thread Local Allocation Buffer)線程私有的緩存區。

基本概念介紹

逃逸分析,是一種可以有效減少Java程序中同步負載和內存堆分配壓力的跨函數全局數據流分析算法。通過逃逸分析,Java Hotspot編譯器能夠分析出一個新的對象的引用的使用范圍從而決定是否要將這個對象分配到堆上。

在計算機語言編譯器優化原理中,逃逸分析是指分析指針動態范圍的方法,它同編譯器優化原理的指針分析和外形分析相關聯。當變量(或者對象)在方法中分配后,其指針有可能被返回或者被全局引用,這樣就會被其他過程或者線程所引用,這種現象稱作指針(或者引用)的逃逸(Escape)。通俗點講,如果一個對象的指針被多個方法或者線程引用時,那么我們就稱這個對象的指針發生了逃逸。

Java在Java SE 6u23以及以后的版本中支持并默認開啟了逃逸分析的選項。Java的 HotSpot JIT編譯器,能夠在方法重載或者動態加載代碼的時候對代碼進行逃逸分析,同時Java對象在堆上分配和內置線程的特點使得逃逸分析成Java的重要功能。

代碼示例

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package me.stormma.gc;
/**
 * <p>Created on 2017/4/21.</p>
 *
 * @author stormma
 *
 * @title <p>逃逸分析</p>
 */
public class EscapeAnalysis {
  public static B b;
  /**
   * <p>全局變量賦值發生指針逃逸</p>
   */
  public void globalVariablePointerEscape() {
    b = new B();
  }
  /**
   * <p>方法返回引用,發生指針逃逸</p>
   * @return
   */
  public B methodPointerEscape() {
    return new B();
  }
  /**
   * <p>實例引用發生指針逃逸</p>
   */
  public void instancePassPointerEscape() {
    methodPointerEscape().printClassName(this);
  }
  class B {
    public void printClassName(EscapeAnalysis clazz) {
      System.out.println(clazz.getClass().getName());
    }
  }
}

逃逸分析研究對于 java 編譯器有什么好處呢?我們知道 java 對象總是在堆中被分配的,因此 java 對象的創建和回收對系統的開銷是很大的。java 語言被批評的一個地方,也是認為 java 性能慢的一個原因就是 java不支持棧上分配對象。JDK6里的 Swing內存和性能消耗的瓶頸就是由于 GC 來遍歷引用樹并回收內存的,如果對象的數目比較多,將給 GC 帶來較大的壓力,也間接得影響了性能。減少臨時對象在堆內分配的數量,無疑是最有效的優化方法。java 中應用里普遍存在一種場景,一般是在方法體內,聲明了一個局部變量,并且該變量在方法執行生命周期內未發生逃逸,按照 JVM內存分配機制,首先會在堆內存上創建類的實例(對象),然后將此對象的引用壓入調用棧,繼續執行,這是 JVM優化前的方式。當然,我們可以采用逃逸分析對 JVM 進行優化。即針對棧的重新分配方式,首先我們需要分析并且找到未逃逸的變量,將該變量類的實例化內存直接在棧里分配,無需進入堆,分配完成之后,繼續調用棧內執行,最后線程執行結束,棧空間被回收,局部變量對象也被回收,通過這種方式的優化,與優化前的方案主要區別在于對象的存儲介質,優化前是在堆中,而優化后的是在棧中,從而減少了堆中臨時對象的分配(較耗時),從而優化性能。

使用逃逸分析進行性能優化(-XX:+DoEscapeAnalysis開啟逃逸分析)

?
1
2
3
4
5
6
public void method() {
  Test test = new Test();
  //處理邏輯
  ......
  test = null;
}

這段代碼,之所以可以在棧上進行內存分配,是因為沒有發生指針逃逸,即是引用沒有暴露出這個方法體。

棧和堆內存分配比較

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package me.stormma.gc;
/**
 * <p>Created on 2017/4/21.</p>
 *
 * @author stormma
 * @description: <p>內存分配比較</p>
 */
public class EscapeAnalysisTest {
  public static void alloc() {
    byte[] b = new byte[2];
    b[0] = 1;
  }
  public static void main(String[] args) {
    long b = System.currentTimeMillis();
    for (int i = 0; i < 100000000; i++) {
      alloc();
    }
    long e = System.currentTimeMillis();
    System.out.println(e - b);
  }
}

JVM 參數為-server -Xmx10m -Xms10m -XX:-DoEscapeAnalysis -XX:+PrintGC, 運行結果

JVM 參數為-server -Xmx10m -Xms10m -XX:+DoEscapeAnalysis -XX:+PrintGC, 運行結果

性能測試

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package me.stormma.gc;
/**
 * <p>Created on 2017/4/21.</p>
 *
 * @author stormma
 *
 * @description: <p>利用逃逸分析進行性能優化</p>
 */
public class EscapeAnalysisTest {
  private static class Foo {
    private int x;
    private static int counter;
    public Foo() {
      x = (++counter);
    }
  }
  public static void main(String[] args) {
    long start = System.nanoTime();
    for (int i = 0; i < 1000 * 1000 * 10; ++i) {
      Foo foo = new Foo();
    }
    long end = System.nanoTime();
    System.out.println("Time cost is " + (end - start));
  }
}

使用逃逸分析優化 JVM輸出結果( -server -XX:+DoEscapeAnalysis -XX:+PrintGC)

?
1
Time cost is 11012345

未使用逃逸分析優化 JVM 輸出結果( -server -Xmx10m -Xms10m -XX:-DoEscapeAnalysis -XX:+PrintGC)

?
1
2
3
4
5
[GC (Allocation Failure) 33280K->408K(125952K), 0.0010344 secs]
[GC (Allocation Failure) 33688K->424K(125952K), 0.0009799 secs]
[GC (Allocation Failure) 33704K->376K(125952K), 0.0007297 secs]
[GC (Allocation Failure) 33656K->456K(159232K), 0.0014817 secs]
Time cost is 68562263

分析結果,性能優化1/6。

總結

以上就是本文關于Java逃逸分析詳解及代碼示例的全部內容,希望對大家有所幫助。有什么問題可以隨時留言,小編會及時回復大家的。感謝朋友們對本站的支持。

原文鏈接:http://www.importnew.com/27262.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲成人一区二区三区四区 | 亚洲黄色一区二区 | 91av在线免费观看 | 国产美女www爽爽爽免费视频 | 国产精品亲子伦av一区二区三区 | 亚洲国产精品一区二区久久 | 一区免费看 | 欧美综合区 | 国产美女啪啪 | 国产午夜精品一区二区三区嫩草 | 久久精品一区 | 一级大片一级一大片 | 99精品视频在线观看 | 亚洲一级黄色 | 一级毛片免费 | 日韩高清一区 | 久久综合久久久 | 日本免费在线视频 | а天堂中文最新一区二区三区 | 日韩成人 | 亚洲网站免费 | 欧美日韩中文字幕在线 | 色在线看 | 在线看av的网址 | 日韩和的一区二在线 | av一区二区三区 | 成人午夜精品久久久久久久网站 | 欧美片网站免费 | ...99久久国产成人免费精品 | av77| 国产一区二区免费视频 | 精品第一页 | 欧美成人黄色小视频 | 色视频在线播放 | 中文av电影| 久久久www成人免费精品 | 国产精品久久久久久久一区探花 | 能免费看的av | 欧美日本一区二区三区 | 人人干天天干 | 国产精品久久久久久中文字 |