一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - 簡(jiǎn)述Java編程語(yǔ)言中的逃逸分析

簡(jiǎn)述Java編程語(yǔ)言中的逃逸分析

2020-12-31 15:42wmingstar Java教程

這篇文章主要介紹了簡(jiǎn)述Java編程語(yǔ)言中的逃逸分析,包括其定義、作用、類(lèi)型及理論基礎(chǔ)等相關(guān)內(nèi)容,十分具有參考價(jià)值,需要的朋友可以了解下。

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

1.逃逸分析的定義

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

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

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

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

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

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

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

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

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

        絕大多數(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)類(lèi)加載、調(diào)用本地函數(shù)以及反射程序調(diào)用等等,都將打破所謂“封閉世界”的約定。

逃逸分析之后的處理操作

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

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

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

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

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

        消除同步:線程同步的代價(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)行的話(huà),就可以將對(duì)象的部分甚至全部都保存在CPU寄存器內(nèi),這樣能大大提高訪問(wèn)速度。

總結(jié)

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

原文鏈接:https://www.2cto.com/kf/201709/676131.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 91久操 | 擦逼视频| 国产日韩一区二区三区在线播放 | 2020国产精品视频免费 | 晚上禁用的十大黄台视频 | 亚洲狠狠婷婷综合久久久久网站 | 日本人妖网站 | 美女认你摸 | 免费视频精品一区二区 | 免费黄色小说 | 女人又色又爽又黄 | 九九九九九热 | 天天做天天爱天天综合网 | xxxx18日本视频xxxxx | 高清毛片一区二区三区 | 交换性关系中文字幕6 | 国产精品久久久久久久免费大片 | 欧美va在线观看 | 波多野结衣被绝伦强在线观看 | 午夜AV内射一区二区三区红桃视 | 成人综合久久综合 | 欧美日韩一二三区免费视频观看 | 国产日韩欧美在线观看不卡 | 亚洲天天做夜夜做天天欢 | 日韩精品一区二区三区毛片 | 青青久在线视频免费观看 | 亚洲日本久久一区二区va | 久久精品久久久久 | 国产精品久久国产三级国电话系列 | 日韩制服丝袜在线观看 | 色综合天天综合 | 免费港剧在线观看港剧 | 亚洲精品午夜在线观看 | 国产精品永久免费视频观看 | 日韩毛片大全免费高清 | 精品图区| 色婷婷综合和线在线 | 国产清纯白嫩大学生正在播放 | 国产aⅴ一区二区三区 | 国产我不卡 | 喘息揉弄1v1h老师 |