<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
逃逸分析一種資料分析演演算法,基於此演演算法可以有效減少 Java 物件在堆記憶體中的分配。 Hotspot 虛擬機器器的編譯器能夠分析出一個新物件的參照範圍,然後決定是否要將這個物件分配到堆上.
當一個物件在方法中被定義後,物件只在方法內部使用,則認為沒有發生逃逸。
當一個物件在方法中被定義後,它被外部方法所參照,則認為發生逃逸。
//物件發生了逃逸,不會在棧上分配,有可能導致GC STW public StringBuffer append(String s1, String s2) { StringBuffer sb = new StringBuffer(); sb.append(s1); sb.append(s2); return sb; } //物件未發生逃逸 public String append(String s1, String s2) { StringBuffer sb = new StringBuffer(); sb.append(s1); sb.append(s2); return sb.toString(); }
建議:開發中能在方法內部應用物件的,就儘量控制在內部
在 JDK 1.7 版本之後, HotSpot 中預設就已經開啟了逃逸分析,如果使用的是較早的
版本,開發人員則可以通過:
✓ 選項“ -XX:+DoEscapeAnalysis" 顯式開啟逃逸分析。
✓ 通過選項“ -XX:+PrintEscapeAnalysis" 檢視逃逸分析的篩選結果。
編譯器可以對程式碼做如下優化
1.棧上分配:將堆分配轉化為棧分配。如果一個物件在方法內建立,要使指向該物件的參照不會發生逃逸,物件可能是棧上分配的候選
/** * 棧上分配測試(-XX:+DoEscapeAnalysis) * -Xmx128m -Xms128m -XX:+DoEscapeAnalysis -XX:+PrintGC */ public class ObjectStackAllocationTests { public static void main(String[] args) throws InterruptedException { long start = System.currentTimeMillis(); for (int i = 0; i < 10000000; i++) { alloc(); } long end = System.currentTimeMillis(); System.out.println("花費的時間為: " + (end - start) + " ms"); // 為了方便檢視堆記憶體中物件個數,執行緒 sleep TimeUnit.MINUTES.sleep(5); } private static void alloc() { byte[] data = new byte[10];//未發生逃逸 } }
2.同步鎖消除:
我們知道執行緒同步是靠犧牲效能來保證資料的正確性,這個過程的代價會非常高。程式 的並行行和效能都會降低。JVM 的 JIT 編譯器可以藉助逃逸分析來判斷同步塊所使用的鎖物件是否只能夠被一個執行緒應用?假如是,那麼 JIT 編譯器在編譯這個同步塊的時候就會取消對這部分程式碼上加的鎖。這個取消同步的過程就叫同步省略,也叫鎖消除
public class SynchronizedLockTest { public void lock() { Object obj= new Object(); synchronized(obj) { System.out.println(obj); } }
3.標量替換分析
所謂的標量(scalar)一般指的是一個無法再分解成更小資料的資料。例如,Java 中 的原始資料型別就是標量。相對的,那些還可以分解的資料叫做聚合量(Aggregate),Java 中的物件就是聚合量,因為他可以分解成其他聚合量和標量。在 JIT 階段,如果經過逃逸分析,發現一個物件不會被外界存取的話,那麼經過 JIT 優化,就會把這個物件分解成若干個變數來代替。這個過程就是標量替換。
public class ObjectScalarReplaceTests { public static void main(String args[]) { long start = System.currentTimeMillis(); for (int i = 0; i < 10000000; i++) { alloc(); } long end = System.currentTimeMillis(); System.out.println("花費的時間為: " + (end - start) + " ms"); } private static void alloc() { Point point = new Point(1,2); } static class Point { private int x; private int y; public Point(int x,int y){ this.x=x; this.y=y; } } //對於上面程式碼,假如開啟了標量替換,那麼 alloc 方法的內容就會變為如下形式 private static void alloc() { int x=10; int y=20; }
alloc 方法內部的 Point 物件是一個聚合量,這個聚合量經過逃逸分析後,發現他並沒有逃逸,就被替換成兩個標量了。那麼標量替換有什麼好處呢?可以大大減少堆記憶體的佔用。因為一旦不需要建立物件了,那麼就不再需要分配堆記憶體了。標量替換為棧上分配 提供了很好的基礎。
1.什麼是逃逸分析?
可以有效減少 Java 物件在堆記憶體中的分配壓力和同步負載的演演算法
2.逃逸分析有什麼優勢、劣勢?
逃逸分析是需要消耗一定的效能去執行分析的,所以說如果方法中的物件全都是處於逃逸狀態,那麼就沒有起到優化的作用,從而就白白損失了這部分的效能消耗
到此這篇關於JVM記憶體增強之逃逸分析的文章就介紹到這了,更多相關JVM逃逸內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45