中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中逃逸問題的示例分析

發布時間:2021-08-05 10:10:41 來源:億速云 閱讀:128 作者:小新 欄目:編程語言

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

逃逸分析的定義

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

Java在Java SE 6u23以及以后的版本中支持并默認開啟了逃逸分析的選項。Java的 HotSpot JIT編譯器,能夠在方法重載或者動態加載代碼的時候對代碼進行逃逸分析。

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

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

逃逸分析的理論基礎

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

該算法引入了連通圖,用連通圖來構建對象和對象引用之間的可達性關系,并在次基礎上,提出一種組合數據流分析法。由于該算法是上下文相關和流敏感的,并且模擬了對象任意層次的嵌套關系,所以分析精度較高,只是運行時間和內存消耗相對較大。

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

逃逸分析之后的處理操作

經過逃逸分析之后,可以得到對象三種可能的逃逸狀態:

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

ArgEscape(參數級逃逸):即在方法調用過程當中傳遞對象的應用給一個方法。這種狀態可以通過分析被調方法的二進制代碼確定。

NoEscape(沒有逃逸):一個可以進行標量替換的對象。該對象可以不被分配在傳統的堆上。

編譯器可以使用逃逸分析的結果,對程序進行優化:

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

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

矢量替代:逃逸分析方法如果發現對象的內存存儲結構不需要連續進行的話,就可以將對象的部分甚至全部都保存在CPU寄存器內,這樣能大大提高訪問速度。

以上是“Java中逃逸問題的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

酒泉市| 东城区| 博罗县| 吕梁市| 揭西县| 武夷山市| 莱西市| 新津县| 遂川县| 密云县| 崇阳县| 房山区| 镇赉县| 四平市| 县级市| 搜索| 临沂市| 盐津县| 车致| 满洲里市| 克什克腾旗| 社会| 肃南| 安溪县| 夏邑县| 松溪县| 二连浩特市| 桦川县| 南投县| 屯昌县| 蒙城县| 博乐市| 马尔康县| 抚远县| 科尔| 太湖县| 黄陵县| 进贤县| 康马县| 福海县| 溧阳市|