亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

淺析JVM逃逸的原理及分析

2024-07-14 08:42:28
字體:
來源:轉載
供稿:網友

我們都知道Java中的對象默認都是分配到堆上,在調用棧中,只保存了對象的指針。當對象不再使用后,需要依靠GC來遍歷引用樹并回收內存。如果堆中對象數量太多,回收對象還有整理內存,都會會帶來時間上的消耗,GC表示壓力很大,然后影響性能。所以,在我們日常開發中,內存,時間都是相當的寶貴,該如何優化堆棧開銷,是一個比較重要的問題。

在這里,我以逃逸分析角度聊聊JVM優化的那些事兒。

為什么“逃逸”

在計算機語言編譯器優化原理中,逃逸分析是指分析指針動態范圍的方法,它同編譯器優化原理的指針分析和外形分析相關聯。當變量(或者對象)在方法中分配后,其指針有可能被返回或者被全局引用,這樣就會被其他方法或者線程所引用,這種現象稱作指針(或者引用)的逃逸(Escape)。通俗點講,如果一個對象的指針被多個方法或者線程引用時,那么我們就稱這個對象的指針(或對象)的逃逸(Escape)。

網上有位博友這么形容逃逸,用了一段簡單直接的代碼,我覺得挺直截了當的,可以供參考:

public StringBuilder escapeDemo1(System a, System b) {  StringBuilder stringBuilder = new StringBuilder();  stringBuilder.append(a);  stringBuilder.append(b);  return stringBuilder;}

stringBuilder是在方法的內部變量,而此時它被直接返回,這樣stringBuilder就有可能被其他地方的方法或參數所改變,這樣它的作用域就不只是demo1了,雖然它是一個局部變量,但其發生了“逃逸”。

那么,我可以改一下代碼:

public String escapeDemo2(System a, System b) {  StringBuilder stringBuilder = new StringBuilder();  stringBuilder.append(a);  stringBuilder.append(b);  return stringBuilder.toString();}

如此,就沒有返回StringBuilder,而是toString(),那么StringBuilder沒有從方法中直接脫離,就沒有發生逃逸。

什么是逃逸分析

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

逃逸分析的原理

Java本身的限制(對象只能分配到堆中),我可以這么理解了,為了減少臨時對象在堆內分配的數量,我會在一個方法體內定義一個局部變量,并且該變量在方法執行過程中未發生逃逸,按照JVM調優機制,首先會在堆內存創建類的實例,然后將此對象的引用壓入調用棧,繼續執行,這是JVM優化前的方式。然后,我采用逃逸分析對JVM進行優化。即針對棧的重新分配方式,首先找出未逃逸的變量,將該變量直接存到棧里,無需進入堆,分配完成后,繼續調用棧內執行,最后線程執行結束,??臻g被回收,局部變量也被回收了。如此操作,是優化前在堆中,優化后在棧中,從而減少了堆中對象的分配和銷毀,從而優化性能。

逃逸的方式

方法逃逸:在一個方法體內,定義一個局部變量,而它可能被外部方法引用,比如作為調用參數傳遞給方法,或作為對象直接返回?;蛘撸梢岳斫獬蓪ο筇隽朔椒?。

線程逃逸:這個對象被其他線程訪問到,比如賦值給了實例變量,并被其他線程訪問到了。對象逃出了當前線程。

逃逸分析的好處

如果一個對象不會在方法體內,或線程內發生逃逸(或者說是通過逃逸分析后,使其未能發生逃逸)

1. 棧上分配

一般情況下,不會逃逸的對象所占空間比較大,如果能使用棧上的空間,那么大量的對象將隨方法的結束而銷毀,減輕了GC壓力

2. 同步消除

如果你定義的類的方法上有同步鎖,但在運行時,卻只有一個線程在訪問,此時逃逸分析后的機器碼,會去掉同步鎖運行。

3. 標量替換

Java虛擬機中的原始數據類型(int,long等數值類型以及reference類型等)都不能再進一步分解,它們可以稱為標量。相對的,如果一個數據可以繼續分解,那它稱為聚合量,Java中最典型的聚合量是對象。如果逃逸分析證明一個對象不會被外部訪問,并且這個對象是可分解的,那程序真正執行的時候將可能不創建這個對象,而改為直接創建它的若干個被這個方法使用到的成員變量來代替。拆散后的變量便可以被單獨分析與優化,可以各自分別在棧幀或寄存器上分配空間,原本的對象就無需整體分配空間了。

開啟設置

在JDK 6u23以上是默認開啟,這里將設置重新明確一下: 

強制開啟:  

-server -XX:+DoEscapeAnalysis -XX:+PrintGCDetail -Xmx10m -Xms10m

關閉逃逸分析:

-server -XX:-DoEscapeAnalysis -XX:+PrintGCDetail -Xmx10m -Xms10m

寫在結尾

棧上的空間一般而言是非常小的,只能存放若干變化和小的數據結構,無法存儲大容量數據。目前的實現都是采用不那么準確但是時間壓力相對較小的算法來完成逃逸分析,這就可能導致效果不穩定。所以,逃逸分析的效果只能在特定場景下,滿足高頻和高數量的小容量的變量分配結構,才是合適的。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲高清福利视频| 国产成人精品久久久| 中文字幕免费国产精品| 欧美大片免费观看| 97久久久免费福利网址| 亚洲精品第一页| 国产日韩欧美视频在线| 国产精品久久久久久久一区探花| 日韩在线视频一区| 亚洲国产精品福利| 国产免费一区二区三区在线能观看| 亚洲欧洲偷拍精品| 一色桃子一区二区| 91免费观看网站| 亚州av一区二区| 国产一区二区三区在线视频| 欧美国产高跟鞋裸体秀xxxhd| 色综合亚洲精品激情狠狠| 日韩成人av网| 韩国三级电影久久久久久| 国产精品国模在线| 亚洲精品xxxx| 日韩欧美在线一区| 精品一区二区三区四区| 韩国v欧美v日本v亚洲| 色综合色综合网色综合| 欧美国产精品人人做人人爱| 91色琪琪电影亚洲精品久久| 一区二区国产精品视频| 色综合91久久精品中文字幕| 中文字幕精品在线视频| 91香蕉国产在线观看| 久久男人资源视频| 国产精品久久久久久久av大片| 日韩中文在线视频| 亚洲人午夜色婷婷| 中文字幕一区二区三区电影| 欧美精品在线看| 91成人国产在线观看| 国产精品99久久久久久人| 91亚洲永久免费精品| 国产日韩在线免费| 午夜精品久久久久久99热软件| 性色av一区二区三区免费| 91夜夜揉人人捏人人添红杏| 91欧美视频网站| 91国语精品自产拍在线观看性色| 亚洲欧美日韩第一区| 国产999在线| 深夜福利一区二区| 日韩在线视频免费观看| 日韩视频免费中文字幕| 亚洲色图18p| 亚洲最大的网站| 日本精品免费一区二区三区| 狠狠操狠狠色综合网| 日韩性xxxx爱| 久久久国产精品视频| 欧美巨大黑人极品精男| 国产在线视频一区| 国产一区二区三区四区福利| 日本精品视频在线观看| 亚洲91精品在线观看| 亚洲护士老师的毛茸茸最新章节| 亚洲第一区在线| 伊人av综合网| 欧美视频一区二区三区…| 91视频88av| 精品自在线视频| 欧美精品九九久久| 国产香蕉精品视频一区二区三区| 亚洲毛片在线免费观看| 国产精品视频白浆免费视频| 日韩成人中文字幕在线观看| 国产精品电影在线观看| 国产精品美女在线| 亚洲午夜精品久久久久久久久久久久| 午夜精品蜜臀一区二区三区免费| 欧美日韩亚洲精品一区二区三区| 精品国模在线视频| 欧美日韩免费观看中文| 久久这里只有精品99| 日韩中文字幕视频在线观看| 97国产一区二区精品久久呦| 欧美极品少妇xxxxⅹ免费视频| 欧美成人免费va影院高清| 91免费视频国产| 国产日韩欧美视频在线| 欧美中文字幕在线播放| 国产美女久久精品| 日韩av中文字幕在线播放| 久久香蕉精品香蕉| 欧美一区二区影院| 成人午夜在线观看| 亚洲一区二区三| 日韩中文字幕在线免费观看| 国产精品久久久久久久久久尿| 亚洲第一区第二区| 中文字幕在线看视频国产欧美在线看完整| 国产欧亚日韩视频| 精品国偷自产在线| 中文字幕国产精品久久| 正在播放国产一区| 亚洲一级免费视频| 国产精品啪视频| 精品丝袜一区二区三区| 国产精品第一第二| 精品国偷自产在线视频| 538国产精品视频一区二区| 最近2019年好看中文字幕视频| 国产色综合天天综合网| 日韩欧美在线视频日韩欧美在线视频| 国产在线不卡精品| 亚洲欧美中文另类| 91精品国产91久久久久久吃药| 亚洲欧美制服第一页| 欧美日韩国产丝袜美女| 国产精品欧美日韩一区二区| 日韩三级成人av网| 久久天天躁夜夜躁狠狠躁2022| 欧美色视频日本高清在线观看| 欧美成人免费在线观看| 欧美激情综合亚洲一二区| 日韩国产精品亚洲а∨天堂免| 久热精品视频在线观看一区| 中国china体内裑精亚洲片| 久久九九全国免费精品观看| 9.1国产丝袜在线观看| 国产999精品久久久影片官网| 国产精品精品久久久久久| 日韩视频欧美视频| 成人午夜激情网| 欧美另类老肥妇| 成人激情在线播放| 欧美一级高清免费| 国产精品久久久久久久久影视| 欧美日韩亚洲成人| 日韩成人xxxx| 久久免费观看视频| 欧美日韩免费在线| 亚洲四色影视在线观看| 中文字幕不卡在线视频极品| 在线观看视频99| 91成品人片a无限观看| 日韩av影片在线观看| 在线成人激情黄色| 久久99久久久久久久噜噜| 超碰91人人草人人干| 国产成人免费91av在线| 一区二区三区视频免费在线观看| 国产精品免费在线免费| 欧美日韩亚洲精品一区二区三区| 国产精品一区二区三区毛片淫片| 久久精品中文字幕免费mv| 2019中文字幕免费视频| 在线免费观看羞羞视频一区二区| 岛国av一区二区在线在线观看| 久久好看免费视频| 成人黄色在线观看| 88国产精品欧美一区二区三区| 亚洲成人黄色网| 国产精品爽爽爽爽爽爽在线观看| 久久男人av资源网站| 亚洲第一网站免费视频|