乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      (3)Java內(nèi)存對(duì)象的逃逸分析

       dongsibei 2014-04-25
          逃逸分析英文作Escape Analysis。在計(jì)算機(jī)語(yǔ)言編譯器優(yōu)化原理中,逃逸分析是指分析指針動(dòng)態(tài)范圍的方法,它同編譯器優(yōu)化原理的指針?lè)治龊屯庑畏治鱿嚓P(guān)聯(lián)。
          當(dāng)變量(或者對(duì)象)在方法中分配后,其指針有可能被返回或者被全局引用,這樣就會(huì)被其他過(guò)程或者線程所引用,這種現(xiàn)象稱作指針(或者引用)的逃逸(Escape)。
          在Java中比如下面的方法:
      ......
      static V global_v;
      public void a_method(){
         V v=b_method();
         c_method();
      }
      public V b_method(){
         V v=new V();
         return v;
      }
      public void c_method(){
         global_v=new V();
      }
          其中b_method方法內(nèi)部生成的V對(duì)象的引用被返回給a_method方法內(nèi)的變量v,c_method方法內(nèi)生成的V對(duì)象被賦給了全局變量global_v。這兩種場(chǎng)景都發(fā)生了指針(引用)逃逸。
          逃逸分析研究對(duì)于Java編譯器有什么好處?我們知道Java對(duì)象總是在堆中分配的,因此Java對(duì)象的創(chuàng)建和回收對(duì)系統(tǒng)的開銷是很大的。Java語(yǔ)言被批評(píng)的一個(gè)地方,也是認(rèn)為Java性能慢的一個(gè)原因就是Java不支持運(yùn)行時(shí)棧分配對(duì)象,缺少像C#里面的值對(duì)象或者C++里面的struct結(jié)構(gòu)。
          前面一篇文章《Java并發(fā)編程-常量對(duì)象(七)》就曾討論過(guò)這個(gè)問(wèn)題,這是Swing內(nèi)存和性能消耗的瓶頸。近幾年業(yè)界曾進(jìn)行過(guò)激烈討論,Java 6中是否應(yīng)該加入棧分配對(duì)象。其中有人主張可以通過(guò)JIT進(jìn)行逃逸分析的方式來(lái)解決目前的問(wèn)題,不用在語(yǔ)言級(jí)別進(jìn)行支持,虛擬機(jī)支持棧分配機(jī)制,由JIT對(duì)代碼進(jìn)行內(nèi)聯(lián)優(yōu)化和逃逸分析。
          那么JIT怎么通過(guò)逃逸分析進(jìn)行代碼優(yōu)化呢?分析下面的過(guò)程代碼:
      public void my_method(){
          V v=new V();
          //use v
          ......
          v=null;
      }
          在這個(gè)方法中創(chuàng)建的局部對(duì)象被賦給了v,但是沒(méi)有返回,沒(méi)有賦給全局變量等等操作,因此這個(gè)對(duì)象是沒(méi)有逃逸的,是可以在運(yùn)行時(shí)棧進(jìn)行分配和銷毀的對(duì)象。沒(méi)有發(fā)生逃逸的對(duì)象由于生命周期都在一個(gè)方法體內(nèi),因此它們是可以在運(yùn)行時(shí)棧上分配并銷毀。
          這樣在JIT編譯Java偽代碼時(shí),如果能分析出這種代碼,那么非逃逸對(duì)象其創(chuàng)建和回收就可以在棧上進(jìn)行,從而能大大提高Java的運(yùn)行性能。
          另外為什么要在逃逸分析之前進(jìn)行內(nèi)聯(lián)分析呢?這是因?yàn)橥行?duì)象在被調(diào)用過(guò)程中創(chuàng)建并返回給調(diào)用過(guò)程,調(diào)用過(guò)程使用完該對(duì)象就銷毀了。這種情況下如果將這些方法進(jìn)行內(nèi)聯(lián),它們就由兩個(gè)方法體變成一個(gè)方法體了,這種原來(lái)通過(guò)返回傳遞的對(duì)象就變成了方法內(nèi)的局部對(duì)象,就變成了非逃逸對(duì)象了,這樣這些對(duì)象就可以在同一棧上進(jìn)行分配了。
          據(jù)說(shuō)Java 6的虛擬機(jī)已經(jīng)支持對(duì)象的棧分配和逃逸分析機(jī)制了,但目前并沒(méi)有啟動(dòng)。具可靠的消息,Java 7中將啟動(dòng)這一功能。這對(duì)Swing來(lái)說(shuō)又是一次大規(guī)模提升速度的機(jī)會(huì)。
          除能將堆分配對(duì)象變成棧分配對(duì)象,逃逸分析還有其他兩個(gè)優(yōu)化應(yīng)用。一是同步消除。我們知道線程同步的代價(jià)是相當(dāng)高的,同步的后果是降低并發(fā)性和性能。逃逸分析可以判斷出某個(gè)對(duì)象是否始終只被一個(gè)線程訪問(wèn),如果只被一個(gè)線程訪問(wèn),那么對(duì)該對(duì)象的同步操作就可以轉(zhuǎn)化成沒(méi)有同步保護(hù)的操作,這樣就能大大提高并發(fā)程度和性能。
          二是矢量替代。逃逸分析方法如果發(fā)現(xiàn)對(duì)象的內(nèi)存存儲(chǔ)結(jié)構(gòu)不需要連續(xù)進(jìn)行的話,就可以將對(duì)象的部分甚至全部都保存在CPU寄存器內(nèi),這樣能大大提高訪問(wèn)速度。
          Java 7將完全支持了棧式分配對(duì)象,JIT將支持逃逸分析優(yōu)化,另外Java 7還將缺省支持OpenGL的加速功能,光這三種平臺(tái)性能的提升就會(huì)給Swing帶來(lái)又一次性能的革命。
          Swing的未來(lái)越來(lái)越光明Java內(nèi)存對(duì)象的逃逸分析

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多