欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入了解java中的逃逸分析

 更新時間:2019年09月26日 08:23:52   投稿:yaominghui  
這篇文章主要介紹了深入了解java中的逃逸分析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

逃逸分析

public static StringBuffer craeteStringBuffer(String s1, String s2) {
  StringBuffer sb = new StringBuffer();
  sb.append(s1);
  sb.append(s2);
  return sb;
}

public static String createStringBuffer(String s1, String s2) {
  StringBuffer sb = new StringBuffer();
  sb.append(s1);
  sb.append(s2);
  return sb.toString();
}

第一段代碼中的sb就逃逸了,而第二段代碼中的sb就沒有逃逸。

在Java代碼運行時,通過JVM參數(shù)可指定是否開啟逃逸分析,-XX:+DoEscapeAnalysis : 表示開啟逃逸分析

-XX:-DoEscapeAnalysis : 表示關(guān)閉逃逸分析 從jdk 1.7開始已經(jīng)默認開始逃逸分析,如需關(guān)閉,需要指定-XX:-DoEscapeAnalysis

作用

使用逃逸分析,編譯器可以對代碼做如下優(yōu)化

鎖消除

如果一個對象被發(fā)現(xiàn)只能從一個線程被訪問到,那么對于這個對象的操作可以不考慮同步。

鎖消除前

public void f() {
  Object o = new Object();
  synchronized(o) {
    System.out.println(o);
  }
}

鎖消除后

public void f() {
  Object o = new Object();
  System.out.println(o);
}

標量替換

分離對象或標量替換。有的對象可能不需要作為一個連續(xù)的內(nèi)存結(jié)構(gòu)存在也可以被訪問到,那么對象的部分(或全部)可以不存儲在內(nèi)存,而是存儲在CPU寄存器中。

標量替換前

public static void main(String[] args) {
  alloc();
}

private static void alloc() {
  Point point = new Point(1,2);
  System.out.println("point.x="+point.x+"; point.y="+point.y);
}
class Point{
  private int x;
  private int y;
}

標量替換后

private static void alloc() {
  int x = 1;
  int y = 2;
  System.out.println("point.x="+x+"; point.y="+y);
}

棧上分配

在Java虛擬機中,對象是在Java堆中分配內(nèi)存的,這是一個普遍的常識。但是,有一種特殊情況,那就是如果經(jīng)過逃逸分析后發(fā)現(xiàn),一個對象并沒有逃逸出方法的話,那么就可能被優(yōu)化成棧上分配。這樣就無需在堆上分配內(nèi)存,也無須進行垃圾回收了。

public static void main(String[] args) {
  long a1 = System.currentTimeMillis();
  for (int i = 0; i < 1000000; i++) {
    alloc();
  }
  // 查看執(zhí)行時間
  long a2 = System.currentTimeMillis();
  System.out.println("cost " + (a2 - a1) + " ms");
  // 為了方便查看堆內(nèi)存中對象個數(shù),線程sleep
  try {
    Thread.sleep(100000);
  } catch (InterruptedException e1) {
    e1.printStackTrace();
  }
}

private static void alloc() {
  User user = new User();
}

static class User {

}

在alloc方法中定義了User對象,但是并沒有在方法外部引用他。也就是說,這個對象并不會逃逸到alloc外部。經(jīng)過JIT的逃逸分析之后,就可以對其內(nèi)存分配進行優(yōu)化。

未開啟逃逸分析

Xmx4G -Xms4G -XX:-DoEscapeAnalysis -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError

結(jié)果

➜ ~ jps
2809 StackAllocTest
2810 Jps
➜ ~ jmap -histo 2809

 num   #instances     #bytes class name
----------------------------------------------
  1:      524    87282184 [I
  2:    1000000    16000000 StackAllocTest$User
  3:     6806    2093136 [B
  4:     8006    1320872 [C
  5:     4188     100512 java.lang.String
  6:      581     66304 java.lang.Class

堆中共創(chuàng)建了100萬個StackAllocTest$User實例。

開啟逃逸分析

-Xmx4G -Xms4G -XX:+DoEscapeAnalysis -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError 

結(jié)果

➜ ~ jps
709
2858 Launcher
2859 StackAllocTest
2860 Jps
➜ ~ jmap -histo 2859

 num   #instances     #bytes class name
----------------------------------------------
  1:      524   101944280 [I
  2:     6806    2093136 [B
  3:     83619    1337904 StackAllocTest$User
  4:     8006    1320872 [C
  5:     4188     100512 java.lang.String
  6:      581     66304 java.lang.Class

開啟了逃逸分析之后(-XX:+DoEscapeAnalysis),在堆內(nèi)存中只有8萬多個StackAllocTest$User對象

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解Spring中bean生命周期回調(diào)方法

    詳解Spring中bean生命周期回調(diào)方法

    本篇文章主要介紹了詳解Spring中bean生命周期回調(diào)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • springboot整合nacos的入門Demo及Nacos安裝部署

    springboot整合nacos的入門Demo及Nacos安裝部署

    Nacos?提供了一組簡單易用的特性集,幫助您快速實現(xiàn)動態(tài)服務(wù)發(fā)現(xiàn)、服務(wù)配置、服務(wù)元數(shù)據(jù)及流量管理,Nacos?致力于幫助您發(fā)現(xiàn)、配置和管理微服務(wù),這篇文章主要介紹了springboot整合nacos的入門Demo,需要的朋友可以參考下
    2024-01-01
  • 誤將.idea文件提交至git后刪除的操作方法

    誤將.idea文件提交至git后刪除的操作方法

    這篇文章主要介紹了誤將.idea文件提交至git后刪除的操作方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • java數(shù)組基礎(chǔ)詳解

    java數(shù)組基礎(chǔ)詳解

    這篇文章主要介紹了Java數(shù)組基礎(chǔ)詳解,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • 最全MyBatis核心配置文件總結(jié)(收藏)

    最全MyBatis核心配置文件總結(jié)(收藏)

    這篇文章主要介紹了最全MyBatis核心配置文件總結(jié)(收藏),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • 淺談JDK、JRE、JVM三者之間的關(guān)系

    淺談JDK、JRE、JVM三者之間的關(guān)系

    本文主要介紹了淺談JDK、JRE、JVM三者之間的關(guān)系,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • struts2簡介_動力節(jié)點Java學院整理

    struts2簡介_動力節(jié)點Java學院整理

    Struts2框架是MVC流程框架,適合分層開發(fā),這篇文章主要為大家詳細介紹了struts2簡介的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • 淺談Java文件執(zhí)行順序、main程序入口的理解

    淺談Java文件執(zhí)行順序、main程序入口的理解

    這篇文章主要介紹了Java文件執(zhí)行順序、main程序入口的理解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • java調(diào)用FFmpeg實現(xiàn)視屏壓縮功能的詳細步驟

    java調(diào)用FFmpeg實現(xiàn)視屏壓縮功能的詳細步驟

    這篇文章主要介紹了java調(diào)用FFmpeg實現(xiàn)視屏壓縮功能,本文簡單的展示了java調(diào)用FFmpeg命令實現(xiàn)視屏的壓縮的詳細步驟,需要的朋友可以參考下
    2021-09-09
  • 利用Sharding-Jdbc進行分庫分表的操作代碼

    利用Sharding-Jdbc進行分庫分表的操作代碼

    sharding-jdbc是一個分布式的關(guān)系型數(shù)據(jù)庫中間件,今天通過本文給大家介紹利用Sharding-Jdbc進行分庫分表的操作代碼,代碼簡單易懂對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2022-01-01

最新評論