最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

簡述Java編程語言中的逃逸分析

 更新時(shí)間:2017年09月11日 10:03:50   作者:wmingstar  
這篇文章主要介紹了簡述Java編程語言中的逃逸分析,包括其定義、作用、類型及理論基礎(chǔ)等相關(guān)內(nèi)容,十分具有參考價(jià)值,需要的朋友可以了解下。

        大家一般認(rèn)為new出來的對象都是被分配在堆上,但這并不是完全正確,通過對Java對象分配過程分析,我們發(fā)現(xiàn)對象除了可以被分配在堆上,還可以在?;騎LAB中分配空間。而棧上分配對象的技術(shù)基礎(chǔ)是逃逸分析和標(biāo)量替換,本文主要介紹下逃逸分析。

1.逃逸分析的定義

        逃逸分析:是一種可以有效減少Java 程序中同步負(fù)載和內(nèi)存堆分配壓力的跨函數(shù)全局?jǐn)?shù)據(jù)流分析算法。

        通過逃逸分析,Java Hotspot編譯器能夠分析出一個(gè)新的對象的引用的使用范圍從而決定是否要將這個(gè)對象分配到堆上。

        Java在Java SE 6u23以及以后的版本中支持并默認(rèn)開啟了逃逸分析的選項(xiàng)。Java的 HotSpot JIT編譯器,能夠在方法重載或者動(dòng)態(tài)加載代碼的時(shí)候?qū)Υa進(jìn)行逃逸分析。

        逃逸分析的基本行為就是分析對象的動(dòng)態(tài)作用域:當(dāng)一個(gè)對象在方法中被定義后,它可能被外部方法所引用。

        方法逃逸:例如作為調(diào)用參數(shù)傳遞到其他方法中。

        線程逃逸:有可能被外部線程訪問到,譬如賦值給類變量或可以在其他線程中訪問的實(shí)例變量。

2.逃逸分析的理論基礎(chǔ)

        基于 Jong-Deok Choi, Manish Gupta, Mauricio Seffano,Vugranam C. Sreedhar, Sam Midkiff等在論文《Escape Analysis for Java》中描述的算法進(jìn)行逃逸分析。

        該算法引入了連通圖,用連通圖來構(gòu)建對象和對象引用之間的可達(dá)性關(guān)系,并在次基礎(chǔ)上,提出一種組合數(shù)據(jù)流分析法。由于該算法是上下文相關(guān)和流敏感的,并且模擬了對象任意層次的嵌套關(guān)系,所以分析精度較高,只是運(yùn)行時(shí)間和內(nèi)存消耗相對較大。

        絕大多數(shù)逃逸分析的實(shí)現(xiàn)都基于“封閉世界(closed world)”的前提:所有可能被執(zhí)行的,方法在做逃逸分析前都已經(jīng)得知,并且,程序的實(shí)際運(yùn)行不會(huì)改變它們之間的調(diào)用關(guān)系 。但當(dāng)真實(shí)的 Java 程序運(yùn)行時(shí),這樣的假設(shè)并不成立。Java 程序擁有的許多特性,例如動(dòng)態(tài)類加載、調(diào)用本地函數(shù)以及反射程序調(diào)用等等,都將打破所謂“封閉世界”的約定。

逃逸分析之后的處理操作

        經(jīng)過逃逸分析之后,可以得到對象三種可能的逃逸狀態(tài)
        GlobalEscape(全局逃逸): 即一個(gè)對象的引用逃出了方法或者線程。例如,一個(gè)對象的引用是復(fù)制給了一個(gè)類變量,或者存儲(chǔ)在在一個(gè)已經(jīng)逃逸的對象當(dāng)中,或者這個(gè)對象的引用作為方法的返回值返回給了調(diào)用方法。

        ArgEscape(參數(shù)級(jí)逃逸):即在方法調(diào)用過程當(dāng)中傳遞對象的應(yīng)用給一個(gè)方法。這種狀態(tài)可以通過分析被調(diào)方法的二進(jìn)制代碼確定。

        NoEscape(沒有逃逸):一個(gè)可以進(jìn)行標(biāo)量替換的對象。該對象可以不被分配在傳統(tǒng)的堆上。

        編譯器可以使用逃逸分析的結(jié)果,對程序進(jìn)行優(yōu)化。

        堆分配對象變成棧分配對象:一個(gè)方法當(dāng)中的對象,對象的引用沒有發(fā)生逃逸,那么這個(gè)方法可能會(huì)被分配在棧內(nèi)存上而非常見的堆內(nèi)存上。

        消除同步:線程同步的代價(jià)是相當(dāng)高的,同步的后果是降低并發(fā)性和性能。逃逸分析可以判斷出某個(gè)對象是否始終只被一個(gè)線程訪問,如果只被一個(gè)線程訪問,那么對該對象的同步操作就可以轉(zhuǎn)化成沒有同步保護(hù)的操作,這樣就能大大提高并發(fā)程度和性能。

        矢量替代:逃逸分析方法如果發(fā)現(xiàn)對象的內(nèi)存存儲(chǔ)結(jié)構(gòu)不需要連續(xù)進(jìn)行的話,就可以將對象的部分甚至全部都保存在CPU寄存器內(nèi),這樣能大大提高訪問速度。

總結(jié)

以上是本文關(guān)于逃逸分析的全部內(nèi)容,希望對大家有所幫助。

相關(guān)文章

  • Java基于FFmpeg實(shí)現(xiàn)Mp4視頻轉(zhuǎn)GIF

    Java基于FFmpeg實(shí)現(xiàn)Mp4視頻轉(zhuǎn)GIF

    FFmpeg是一套可以用來記錄、轉(zhuǎn)換數(shù)字音頻、視頻,并能將其轉(zhuǎn)化為流的開源計(jì)算機(jī)程序。本文主要介紹了在Java中如何基于FFmpeg進(jìn)行Mp4視頻到Gif動(dòng)圖的轉(zhuǎn)換,感興趣的小伙伴可以了解一下
    2022-11-11
  • spring cloud zuul 與 sentinel的結(jié)合使用操作

    spring cloud zuul 與 sentinel的結(jié)合使用操作

    這篇文章主要介紹了spring cloud zuul 與 sentinel 的結(jié)合使用操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java spring事務(wù)及事務(wù)不生效的原因詳解

    Java spring事務(wù)及事務(wù)不生效的原因詳解

    在日常編碼過程中常常涉及到事務(wù),在前兩天看到一篇文章提到了Spring事務(wù),那么在此總結(jié)下在Spring環(huán)境下事務(wù)失效的幾種原因
    2021-09-09
  • 為何修改equals方法時(shí)還要重寫hashcode方法的原因分析

    為何修改equals方法時(shí)還要重寫hashcode方法的原因分析

    這篇文章主要介紹了為何修改equals方法時(shí)還要重寫hashcode方法的原因分析,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java實(shí)現(xiàn)多項(xiàng)式乘法代碼實(shí)例

    Java實(shí)現(xiàn)多項(xiàng)式乘法代碼實(shí)例

    今天小編就為大家分享一篇關(guān)于Java實(shí)現(xiàn)多項(xiàng)式乘法代碼實(shí)例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • JSON數(shù)據(jù)轉(zhuǎn)換成Java對象的方法

    JSON數(shù)據(jù)轉(zhuǎn)換成Java對象的方法

    就目前來講,將Java對象轉(zhuǎn)換成JSON對象還是相當(dāng)簡單的,但是 將JSON對象轉(zhuǎn)換成Java對象,就相對比較復(fù)雜了些
    2014-03-03
  • SpringBoot2基于重復(fù)創(chuàng)建bean的問題及解決

    SpringBoot2基于重復(fù)創(chuàng)建bean的問題及解決

    這篇文章主要介紹了SpringBoot2基于重復(fù)創(chuàng)建bean的問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • SpringBoot中利用AOP和攔截器實(shí)現(xiàn)自定義注解

    SpringBoot中利用AOP和攔截器實(shí)現(xiàn)自定義注解

    本文將通過攔截器+AOP實(shí)現(xiàn)自定義注解,在這里攔截器充當(dāng)在指定注解處要執(zhí)行的方法,aop負(fù)責(zé)將攔截器的方法和要注解生效的地方做一個(gè)織入,感興趣的可以嘗試一下
    2022-06-06
  • Java數(shù)據(jù)類型Integer與int的區(qū)別詳細(xì)解析

    Java數(shù)據(jù)類型Integer與int的區(qū)別詳細(xì)解析

    這篇文章主要介紹了Java數(shù)據(jù)類型Integer與int的區(qū)別詳細(xì)解析,Ingeter是int的包裝類,int的初值為0,Ingeter的初值為null,int和integer(無論new否)比,都為true,因?yàn)闀?huì)把Integer自動(dòng)拆箱為int再去比,需要的朋友可以參考下
    2023-12-12
  • 使用String轉(zhuǎn)換到Map結(jié)構(gòu)

    使用String轉(zhuǎn)換到Map結(jié)構(gòu)

    這篇文章主要介紹了使用String轉(zhuǎn)換到Map結(jié)構(gòu),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11

最新評論

容城县| 尼木县| 永仁县| 延津县| 特克斯县| 芦溪县| 新乡县| 随州市| 兖州市| 赫章县| 富民县| 札达县| 钦州市| 双辽市| 吐鲁番市| 西藏| 新源县| 吴忠市| 延长县| 马鞍山市| 尤溪县| 余姚市| 磐石市| 成都市| 吉首市| 三河市| 綦江县| 盘山县| 汕头市| 北票市| 齐河县| 大厂| 乐业县| 时尚| 安丘市| 台湾省| 萝北县| 纳雍县| 五台县| 福安市| 安宁市|