成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JVM之逃逸分析

云計(jì)算 虛擬化
在編譯程序優(yōu)化理論中,逃逸分析是一種確定指針動(dòng)態(tài)范圍的方法——分析在程序的哪些地方可以訪問(wèn)到指針。它涉及到指針分析和形狀分析。

[[334435]]

什么是逃逸分析

在編譯程序優(yōu)化理論中,逃逸分析是一種確定指針動(dòng)態(tài)范圍的方法——分析在程序的哪些地方可以訪問(wèn)到指針。它涉及到指針分析和形狀分析。

當(dāng)一個(gè)變量(或?qū)ο?在子程序中被分配時(shí),一個(gè)指向變量的指針可能逃逸到其它執(zhí)行線程中,或是返回到調(diào)用者子程序。如果使用尾遞歸優(yōu)化(通常在函數(shù)編程語(yǔ)言中是需要的),對(duì)象也可以看作逃逸到被調(diào)用的子程序中。如果一種語(yǔ)言支持第一類型的延續(xù)性在Scheme和Standard ML of New Jersey中同樣如此),部分調(diào)用棧也可能發(fā)生逃逸。

如果一個(gè)子程序分配一個(gè)對(duì)象并返回一個(gè)該對(duì)象的指針,該對(duì)象可能在程序中被訪問(wèn)到的地方無(wú)法確定——這樣指針就成功“逃逸”了。如果指針存儲(chǔ)在全局變量或者其它數(shù)據(jù)結(jié)構(gòu)中,因?yàn)槿肿兞渴强梢栽诋?dāng)前子程序之外訪問(wèn)的,此時(shí)指針也發(fā)生了逃逸。

逃逸分析確定某個(gè)指針可以存儲(chǔ)的所有地方,以及確定能否保證指針的生命周期只在當(dāng)前進(jìn)程或在其它線程中。

下面我們看看Java中的逃逸分析是怎樣的?

Java的逃逸分析只發(fā)在JIT的即時(shí)編譯中,為什么不在前期的靜態(tài)編譯中就進(jìn)行呢,知乎上已經(jīng)有過(guò)這樣的提問(wèn)。

簡(jiǎn)單來(lái)說(shuō)是可以的,但是Java的分離編譯和動(dòng)態(tài)加載使得前期的靜態(tài)編譯的逃逸分析比較困難或收益較少,所以目前Java的逃逸分析只發(fā)在JIT的即時(shí)編譯中,因?yàn)槭占阶銐虻倪\(yùn)行數(shù)據(jù)JVM可以更好的判斷對(duì)象是否發(fā)生了逃逸。關(guān)于JIT即時(shí)編譯可參考JVM系列之走進(jìn)JIT。

JVM判斷新創(chuàng)建的對(duì)象是否逃逸的依據(jù)有:

一、對(duì)象被賦值給堆中對(duì)象的字段和類的靜態(tài)變量。

二、對(duì)象被傳進(jìn)了不確定的代碼中去運(yùn)行。

如果滿足了以上情況的任意一種,那這個(gè)對(duì)象JVM就會(huì)判定為逃逸。對(duì)于第一種情況,因?yàn)閷?duì)象被放進(jìn)堆中,則其它線程就可以對(duì)其進(jìn)行訪問(wèn),所以對(duì)象的使用情況,編譯器就無(wú)法再進(jìn)行追蹤。第二種情況相當(dāng)于JVM在解析普通的字節(jié)碼的時(shí)候,如果沒有發(fā)生JIT即時(shí)編譯,編譯器是不能事先完整知道這段代碼會(huì)對(duì)對(duì)象做什么操作。保守一點(diǎn),這個(gè)時(shí)候也只能把對(duì)象是當(dāng)作是逃逸來(lái)處理。下面舉幾個(gè)例子

  1. public class EscapeTest { 
  2.  
  3.     public static Object globalVariableObject; 
  4.  
  5.     public Object instanceObject; 
  6.  
  7.     public void globalVariableEscape(){ 
  8.         globalVariableObject = new Object(); //靜態(tài)變量,外部線程可見,發(fā)生逃逸 
  9.     } 
  10.  
  11.     public void instanceObjectEscape(){ 
  12.         instanceObject = new Object(); //賦值給堆中實(shí)例字段,外部線程可見,發(fā)生逃逸 
  13.     } 
  14.      
  15.     public Object returnObjectEscape(){ 
  16.         return new Object();  //返回實(shí)例,外部線程可見,發(fā)生逃逸 
  17.     } 
  18.  
  19.     public void noEscape(){ 
  20.         synchronized (new Object()){ 
  21.             //僅創(chuàng)建線程可見,對(duì)象無(wú)逃逸 
  22.         } 
  23.         Object noEscape = new Object();  //僅創(chuàng)建線程可見,對(duì)象無(wú)逃逸 
  24.     } 
  25.  

基于逃逸分析的優(yōu)化

當(dāng)判斷出對(duì)象不發(fā)生逃逸時(shí),編譯器可以使用逃逸分析的結(jié)果作一些代碼優(yōu)化

將堆分配轉(zhuǎn)化為棧分配。如果某個(gè)對(duì)象在子程序中被分配,并且指向該對(duì)象的指針永遠(yuǎn)不會(huì)逃逸,該對(duì)象就可以在分配在棧上,而不是在堆上。在有垃圾收集的語(yǔ)言中,這種優(yōu)化可以降低垃圾收集器運(yùn)行的頻率。

同步消除。如果發(fā)現(xiàn)某個(gè)對(duì)象只能從一個(gè)線程可訪問(wèn),那么在這個(gè)對(duì)象上的操作可以不需要同步。

分離對(duì)象或標(biāo)量替換。如果某個(gè)對(duì)象的訪問(wèn)方式不要求該對(duì)象是一個(gè)連續(xù)的內(nèi)存結(jié)構(gòu),那么對(duì)象的部分(或全部)可以不存儲(chǔ)在內(nèi)存,而是存儲(chǔ)在CPU寄存器中。

對(duì)于優(yōu)化一將堆分配轉(zhuǎn)化為棧分配,這個(gè)優(yōu)化也很好理解。下面以代碼例子說(shuō)明:

虛擬機(jī)配置參數(shù):-XX:+PrintGC -Xms5M -Xmn5M -XX:+DoEscapeAnalysis

  • -XX:+DoEscapeAnalysis表示開啟逃逸分析,JDK8是默認(rèn)開啟的
  • -XX:+PrintGC 表示打印GC信息
  • -Xms5M -Xmn5M 設(shè)置JVM內(nèi)存大小是5M
  1. public static void main(String[] args){ 
  2.         for(int i = 0; i < 5_000_000; i++){ 
  3.             createObject(); 
  4.         } 
  5.     } 
  6.  
  7.     public static void createObject(){ 
  8.         new Object(); 
  9.     } 

運(yùn)行結(jié)果是沒有GC。

把虛擬機(jī)參數(shù)改成 -XX:+PrintGC -Xms5M -Xmn5M -XX:-DoEscapeAnalysis。關(guān)閉逃逸分析得到結(jié)果的部分截圖是,說(shuō)明了進(jìn)行了GC,并且次數(shù)還不少。

  1. [GC (Allocation Failure)  4096K->504K(5632K), 0.0012864 secs] 
  2. [GC (Allocation Failure)  4600K->456K(5632K), 0.0008329 secs] 
  3. [GC (Allocation Failure)  4552K->424K(5632K), 0.0006392 secs] 
  4. [GC (Allocation Failure)  4520K->440K(5632K), 0.0007061 secs] 
  5. [GC (Allocation Failure)  4536K->456K(5632K), 0.0009787 secs] 
  6. [GC (Allocation Failure)  4552K->440K(5632K), 0.0007206 secs] 
  7. [GC (Allocation Failure)  4536K->520K(5632K), 0.0009295 secs] 
  8. [GC (Allocation Failure)  4616K->512K(4608K), 0.0005874 secs] 

這說(shuō)明了JVM在逃逸分析之后,將對(duì)象分配在了方法createObject()方法棧上。方法棧上的對(duì)象在方法執(zhí)行完之后,棧楨彈出,對(duì)象就會(huì)自動(dòng)回收。這樣的話就不需要等內(nèi)存滿時(shí)再觸發(fā)內(nèi)存回收。這樣的好處是程序內(nèi)存回收效率高,并且GC頻率也會(huì)減少,程序的性能就提高了。

優(yōu)化二 同步鎖消除

如果發(fā)現(xiàn)某個(gè)對(duì)象只能從一個(gè)線程可訪問(wèn),那么在這個(gè)對(duì)象上的操作可以不需要同步。

虛擬機(jī)配置參數(shù):-XX:+PrintGC -Xms500M -Xmn500M -XX:+DoEscapeAnalysis。配置500M是保證不觸發(fā)GC。

  1. public static void main(String[] args){ 
  2.         long start = System.currentTimeMillis(); 
  3.         for(int i = 0; i < 5_000_000; i++){ 
  4.             createObject(); 
  5.         } 
  6.         System.out.println("cost = " + (System.currentTimeMillis() - start) + "ms"); 
  7.     } 
  8.  
  9.     public static void createObject(){ 
  10.         synchronized (new Object()){ 
  11.  
  12.         } 
  13.     } 

運(yùn)行結(jié)果

  1. cost = 6ms 

把逃逸分析關(guān)掉:-XX:+PrintGC -Xms500M -Xmn500M -XX:-DoEscapeAnalysis

運(yùn)行結(jié)果

  1. cost = 270ms 

說(shuō)明了逃逸分析把鎖消除了,并在性能上得到了很大的提升。這里說(shuō)明一下Java的逃逸分析是方法級(jí)別的,因?yàn)镴IT的即時(shí)編譯是方法級(jí)別。

優(yōu)點(diǎn)三 分離對(duì)象或標(biāo)量替換。

這個(gè)簡(jiǎn)單來(lái)說(shuō)就是把對(duì)象分解成一個(gè)個(gè)基本類型,并且內(nèi)存分配不再是分配在堆上,而是分配在棧上。這樣的好處有,一、減少內(nèi)存使用,因?yàn)椴挥蒙蓪?duì)象頭。 二、程序內(nèi)存回收效率高,并且GC頻率也會(huì)減少,總的來(lái)說(shuō)和上面優(yōu)點(diǎn)一的效果差不多。

OK,現(xiàn)在我們又知道了一件聰明的JVM在背后為我們做的事了。

責(zé)任編輯:武曉燕 來(lái)源: 今日頭條
相關(guān)推薦

2024-04-07 11:33:02

Go逃逸分析

2017-01-12 14:52:03

JVMFinalRefere源碼

2021-10-14 10:22:19

逃逸JVM性能

2018-07-09 15:11:14

Java逃逸JVM

2017-01-11 14:02:32

JVM源碼內(nèi)存

2023-01-10 09:18:37

Go內(nèi)存分配逃逸

2024-12-09 09:50:00

JVM逃逸逃逸分析

2020-05-26 18:50:46

JVMAttachJava

2017-02-27 11:48:58

JVM源碼分析Java

2024-01-17 08:02:26

Java逃逸分配

2022-07-10 23:15:46

Go語(yǔ)言內(nèi)存

2024-12-17 07:41:34

Java逃逸分析

2023-01-28 08:32:04

Go內(nèi)存分配

2010-09-26 16:55:31

JVM學(xué)習(xí)筆記

2012-01-11 11:28:00

JavaJVM

2022-11-30 08:19:15

內(nèi)存分配Go逃逸分析

2017-01-11 14:19:26

JVM源碼All

2019-09-16 09:46:55

對(duì)抗反分析檢測(cè)逃逸惡意軟件

2019-09-16 09:46:55

2023-12-22 07:55:38

Go語(yǔ)言分配策略
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 黄色网络在线观看 | 一区二区三区四区不卡 | 国产成人免费 | 亚洲一区二区在线播放 | 特级生活片| 91久久电影 | 鸡毛片 | 国产区在线观看 | 99视频免费在线 | 久久久久黑人 | 成人性生交大片免费看r链接 | 午夜免费网站 | 操网站 | 99国内精品久久久久久久 | 九九精品在线 | 精品国产一区二区三区日日嗨 | 欧美爱爱视频网站 | 91资源在线| av片免费 | 国外成人免费视频 | 久久婷婷国产香蕉 | 精品福利视频一区二区三区 | 国产亚洲一区二区三区 | 久久久久无码国产精品一区 | 国产精品成人久久久久 | 国产精品亚洲一区二区三区在线观看 | 国产成人精品一区二区三区在线 | 天堂色网| 天堂久久久久久久 | 亚洲一区久久 | 毛片免费观看视频 | 国产一区二区三区在线免费观看 | 亚洲欧美日韩国产综合 | 欧洲一区在线观看 | 国产精品日韩欧美一区二区三区 | 精品久久成人 | 色综合久久久 | 国产成人精品久久二区二区91 | 毛片一级电影 | 国产精品久久久久久久久久久久久 | 精品三区 |