国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 淺析JVM逃逸的原理及分析

淺析JVM逃逸的原理及分析

2021-06-02 15:50Java教程網 Java教程

在本篇文章里我們給大家分享了JVM逃逸的原理及分析的相關知識點內容,需要的讀者們可以學習下。

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

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

為什么“逃逸”

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

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

?
1
2
3
4
5
6
public stringbuilder escapedemo1(system a, system b) {
  stringbuilder stringbuilder = new stringbuilder();
  stringbuilder.append(a);
  stringbuilder.append(b);
  return stringbuilder;
}

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

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

?
1
2
3
4
5
6
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進行優化。即針對棧的重新分配方式,首先找出未逃逸的變量,將該變量直接存到棧里,無需進入堆,分配完成后,繼續調用棧內執行,最后線程執行結束,棧空間被回收,局部變量也被回收了。如此操作,是優化前在堆中,優化后在棧中,從而減少了堆中對象的分配和銷毀,從而優化性能。

逃逸的方式

方法逃逸:在一個方法體內,定義一個局部變量,而它可能被外部方法引用,比如作為調用參數傳遞給方法,或作為對象直接返回。或者,可以理解成對象跳出了方法。

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

逃逸分析的好處

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

1. 棧上分配

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

2. 同步消除

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

3. 標量替換

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

開啟設置

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

強制開啟:  

?
1
-server -xx:+doescapeanalysis -xx:+printgcdetail -xmx10m -xms10m

關閉逃逸分析:

?
1
-server -xx:-doescapeanalysis -xx:+printgcdetail -xmx10m -xms10m

寫在結尾

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

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 九九热视频精品在线观看 | 日韩在线播放一区二区三区 | 国产中文字幕一区 | 国产精品一区一区三区 | 午夜视频免费在线观看 | 一区二区三区久久 | 国产精品美女久久久久久久久久久 | 羞羞视频免费观 | 成人午夜精品 | 成人黄网在线观看 | 欧美精品理论片大全 | 国产精品日产欧美久久久久 | 91久久精品一区 | 少妇精品久久久久久久久久 | 性色视频在线 | 亚洲bbw| 日韩精品视频在线 | 青草精品| 日韩激情一区 | 久久午夜视频 | 糈精国产xxxx在线观看 | 久久人人爽爽爽人久久久 | 中文永久免费观看 | 亚洲国产精品久久久久婷婷老年 | 国产麻豆一区二区三区四区 | 精品色| 亚洲一区二区在线 | 狠狠狠狠狠狠 | 亚洲国产精品电影在线观看 | 91在线视频观看 | 精品国产一区二区三区性色av | 黄久久久 | 成人乱码一区二区三区av | 中文字幕二区 | 欧美xxxx黑人又粗又长 | 一级黄色大片在线观看 | 国产精品亚洲成在人线 | 欧美日韩成人在线 | 国产福利在线观看 | 国产精品精品 | 成人免费看片 |