Java中逃逸問題的示例分析-創(chuàng)新互聯(lián)

小編給大家分享一下Java中逃逸問題的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

10多年專注成都網(wǎng)站制作,成都企業(yè)網(wǎng)站建設(shè),個人網(wǎng)站制作服務(wù),為大家分享網(wǎng)站制作知識、方案,網(wǎng)站設(shè)計流程、步驟,成功服務(wù)上千家企業(yè)。為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁設(shè)計及定制高端網(wǎng)站建設(shè)服務(wù),專注于成都企業(yè)網(wǎng)站建設(shè),高端網(wǎng)頁制作,對成都軟裝設(shè)計等多個領(lǐng)域,擁有豐富的網(wǎng)站維護(hù)經(jīng)驗。

逃逸分析的定義

逃逸分析,是一種可以有效減少Java 程序中同步負(fù)載和內(nèi)存堆分配壓力的跨函數(shù)全局?jǐn)?shù)據(jù)流分析算法。
通過逃逸分析,Java Hotspot編譯器能夠分析出一個新的對象的引用的使用范圍從而決定是否要將這個對象分配到堆上。

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

逃逸分析的基本行為就是分析對象的動態(tài)作用域:當(dāng)一個對象在方法中被定義后,它可能被外部方法所引用。
方法逃逸:例如作為調(diào)用參數(shù)傳遞到其他方法中。

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

逃逸分析的理論基礎(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)行時間和內(nèi)存消耗相對較大。

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

逃逸分析之后的處理操作

經(jīng)過逃逸分析之后,可以得到對象三種可能的逃逸狀態(tài):

GlobalEscape(全局逃逸): 即一個對象的引用逃出了方法或者線程。例如,一個對象的引用是復(fù)制給了一個類變量,或者存儲在在一個已經(jīng)逃逸的對象當(dāng)中,或者這個對象的引用作為方法的返回值返回給了調(diào)用方法。

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

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

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

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

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

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

以上是“Java中逃逸問題的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

網(wǎng)站名稱:Java中逃逸問題的示例分析-創(chuàng)新互聯(lián)
文章轉(zhuǎn)載:http://muchs.cn/article28/eidjp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、微信公眾號虛擬主機(jī)、響應(yīng)式網(wǎng)站、營銷型網(wǎng)站建設(shè)、App開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化