最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺析JVM逃逸的原理及分析

 更新時(shí)間:2018年10月09日 11:22:36   投稿:laozhang  
在本篇文章里我們給大家分享了JVM逃逸的原理及分析的相關(guān)知識(shí)點(diǎn)內(nèi)容,需要的讀者們可以學(xué)習(xí)下。

我們都知道Java中的對(duì)象默認(rèn)都是分配到堆上,在調(diào)用棧中,只保存了對(duì)象的指針。當(dāng)對(duì)象不再使用后,需要依靠GC來(lái)遍歷引用樹(shù)并回收內(nèi)存。如果堆中對(duì)象數(shù)量太多,回收對(duì)象還有整理內(nèi)存,都會(huì)會(huì)帶來(lái)時(shí)間上的消耗,GC表示壓力很大,然后影響性能。所以,在我們?nèi)粘i_(kāi)發(fā)中,內(nèi)存,時(shí)間都是相當(dāng)?shù)膶氋F,該如何優(yōu)化堆棧開(kāi)銷(xiāo),是一個(gè)比較重要的問(wèn)題。

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

為什么“逃逸”

在計(jì)算機(jī)語(yǔ)言編譯器優(yōu)化原理中,逃逸分析是指分析指針動(dòng)態(tài)范圍的方法,它同編譯器優(yōu)化原理的指針?lè)治龊屯庑畏治鱿嚓P(guān)聯(lián)。當(dāng)變量(或者對(duì)象)在方法中分配后,其指針有可能被返回或者被全局引用,這樣就會(huì)被其他方法或者線程所引用,這種現(xiàn)象稱(chēng)作指針(或者引用)的逃逸(Escape)。通俗點(diǎn)講,如果一個(gè)對(duì)象的指針被多個(gè)方法或者線程引用時(shí),那么我們就稱(chēng)這個(gè)對(duì)象的指針(或?qū)ο螅┑奶右荩‥scape)。

網(wǎng)上有位博友這么形容逃逸,用了一段簡(jiǎn)單直接的代碼,我覺(jué)得挺直截了當(dāng)?shù)?,可以供參考?/p>

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

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

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

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

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

什么是逃逸分析

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

逃逸分析的原理

Java本身的限制(對(duì)象只能分配到堆中),我可以這么理解了,為了減少臨時(shí)對(duì)象在堆內(nèi)分配的數(shù)量,我會(huì)在一個(gè)方法體內(nèi)定義一個(gè)局部變量,并且該變量在方法執(zhí)行過(guò)程中未發(fā)生逃逸,按照J(rèn)VM調(diào)優(yōu)機(jī)制,首先會(huì)在堆內(nèi)存創(chuàng)建類(lèi)的實(shí)例,然后將此對(duì)象的引用壓入調(diào)用棧,繼續(xù)執(zhí)行,這是JVM優(yōu)化前的方式。然后,我采用逃逸分析對(duì)JVM進(jìn)行優(yōu)化。即針對(duì)棧的重新分配方式,首先找出未逃逸的變量,將該變量直接存到棧里,無(wú)需進(jìn)入堆,分配完成后,繼續(xù)調(diào)用棧內(nèi)執(zhí)行,最后線程執(zhí)行結(jié)束,??臻g被回收,局部變量也被回收了。如此操作,是優(yōu)化前在堆中,優(yōu)化后在棧中,從而減少了堆中對(duì)象的分配和銷(xiāo)毀,從而優(yōu)化性能。

逃逸的方式

方法逃逸:在一個(gè)方法體內(nèi),定義一個(gè)局部變量,而它可能被外部方法引用,比如作為調(diào)用參數(shù)傳遞給方法,或作為對(duì)象直接返回?;蛘撸梢岳斫獬蓪?duì)象跳出了方法。

線程逃逸:這個(gè)對(duì)象被其他線程訪問(wèn)到,比如賦值給了實(shí)例變量,并被其他線程訪問(wèn)到了。對(duì)象逃出了當(dāng)前線程。

逃逸分析的好處

如果一個(gè)對(duì)象不會(huì)在方法體內(nèi),或線程內(nèi)發(fā)生逃逸(或者說(shuō)是通過(guò)逃逸分析后,使其未能發(fā)生逃逸)

1. 棧上分配

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

2. 同步消除

如果你定義的類(lèi)的方法上有同步鎖,但在運(yùn)行時(shí),卻只有一個(gè)線程在訪問(wèn),此時(shí)逃逸分析后的機(jī)器碼,會(huì)去掉同步鎖運(yùn)行。

3. 標(biāo)量替換

Java虛擬機(jī)中的原始數(shù)據(jù)類(lèi)型(int,long等數(shù)值類(lèi)型以及reference類(lèi)型等)都不能再進(jìn)一步分解,它們可以稱(chēng)為標(biāo)量。相對(duì)的,如果一個(gè)數(shù)據(jù)可以繼續(xù)分解,那它稱(chēng)為聚合量,Java中最典型的聚合量是對(duì)象。如果逃逸分析證明一個(gè)對(duì)象不會(huì)被外部訪問(wèn),并且這個(gè)對(duì)象是可分解的,那程序真正執(zhí)行的時(shí)候?qū)⒖赡懿粍?chuàng)建這個(gè)對(duì)象,而改為直接創(chuàng)建它的若干個(gè)被這個(gè)方法使用到的成員變量來(lái)代替。拆散后的變量便可以被單獨(dú)分析與優(yōu)化,可以各自分別在棧幀或寄存器上分配空間,原本的對(duì)象就無(wú)需整體分配空間了。

開(kāi)啟設(shè)置

在JDK 6u23以上是默認(rèn)開(kāi)啟,這里將設(shè)置重新明確一下:

強(qiáng)制開(kāi)啟:  

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

關(guān)閉逃逸分析:

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

寫(xiě)在結(jié)尾

棧上的空間一般而言是非常小的,只能存放若干變化和小的數(shù)據(jù)結(jié)構(gòu),無(wú)法存儲(chǔ)大容量數(shù)據(jù)。目前的實(shí)現(xiàn)都是采用不那么準(zhǔn)確但是時(shí)間壓力相對(duì)較小的算法來(lái)完成逃逸分析,這就可能導(dǎo)致效果不穩(wěn)定。所以,逃逸分析的效果只能在特定場(chǎng)景下,滿(mǎn)足高頻和高數(shù)量的小容量的變量分配結(jié)構(gòu),才是合適的。

相關(guān)文章

  • 詳解Java中String類(lèi)的各種用法

    詳解Java中String類(lèi)的各種用法

    Java中定義了String和StringBuffer兩個(gè)類(lèi)來(lái)封裝對(duì)字符串的各種操作,存放于java.lang包中,是Java語(yǔ)言的核心類(lèi),提供了字符串的比較、查找、截取、大小寫(xiě)轉(zhuǎn)換等操作,無(wú)需導(dǎo)入即可直接使用它們。讓我們來(lái)詳細(xì)了解它吧
    2021-11-11
  • SpringMVC文件上傳 多文件上傳實(shí)例

    SpringMVC文件上傳 多文件上傳實(shí)例

    這篇文章主要介紹了SpringMVC文件上傳 多文件上傳實(shí)例,有需要的朋友可以參考一下
    2014-01-01
  • Java8 如何正確高效的使用并行流

    Java8 如何正確高效的使用并行流

    這篇文章主要介紹了Java8 如何正確高效的使用并行流,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • SpringBoot整合iText7導(dǎo)出PDF及性能優(yōu)化方式

    SpringBoot整合iText7導(dǎo)出PDF及性能優(yōu)化方式

    在SpringBoot項(xiàng)目中整合iText7庫(kù)以導(dǎo)出PDF文件,不僅能夠滿(mǎn)足報(bào)告生成需求,而且可以處理復(fù)雜的文檔布局與樣式,整合步驟包括添加Maven依賴(lài)、編寫(xiě)PDF生成代碼,性能優(yōu)化方面,建議使用流式處理、緩存樣式與字體、優(yōu)化HTML/CSS結(jié)構(gòu)、采用異步處理
    2024-09-09
  • Java基于二維數(shù)組實(shí)現(xiàn)的數(shù)獨(dú)問(wèn)題示例

    Java基于二維數(shù)組實(shí)現(xiàn)的數(shù)獨(dú)問(wèn)題示例

    這篇文章主要介紹了Java基于二維數(shù)組實(shí)現(xiàn)的數(shù)獨(dú)問(wèn)題,涉及java針對(duì)數(shù)組的遍歷、計(jì)算、轉(zhuǎn)換等相關(guān)操作技巧,需要的朋友可以參考下
    2018-01-01
  • Java實(shí)現(xiàn)去除文檔陰影的示例代碼

    Java實(shí)現(xiàn)去除文檔陰影的示例代碼

    文稿掃描大家用的都比較頻繁、想是各種證件、文件都可以通過(guò)掃描文稿功能保存到手機(jī)。相比直接拍照,在掃描文稿時(shí),程序會(huì)對(duì)圖像進(jìn)行一些矯正。比如去除陰影、修正傾斜、旋轉(zhuǎn)矯正等。進(jìn)行這些處理后的圖片要更加容易識(shí)別。今天就來(lái)討論一下去除陰影的操作
    2022-12-12
  • springboot項(xiàng)目部署到寶塔的詳細(xì)圖文教程

    springboot項(xiàng)目部署到寶塔的詳細(xì)圖文教程

    網(wǎng)上關(guān)于寶塔運(yùn)行springBoot的東西說(shuō)有點(diǎn)迷糊,但是有一句話很重要,Spring boot項(xiàng)目只需要JDK環(huán)境即可部署成功,下面這篇文章主要給大家介紹了關(guān)于springboot項(xiàng)目部署到寶塔的詳細(xì)圖文教程,需要的朋友可以參考下
    2023-05-05
  • JVM要雙親委派的原因及如何打破它

    JVM要雙親委派的原因及如何打破它

    平時(shí)做業(yè)務(wù)開(kāi)發(fā)比較少接觸類(lèi)加載器,但是如果想深入學(xué)習(xí),了解類(lèi)加載的原理是必不可少的.java的類(lèi)加載器有哪些?什么是雙親委派?為什么要雙親委派?如何打破它?接下來(lái)本文就帶大家詳細(xì)介紹這些知識(shí) ,需要的朋友可以參考下
    2021-06-06
  • Springboot深入講解nocos的整合與使用

    Springboot深入講解nocos的整合與使用

    Nacos?是阿里巴巴推出來(lái)的一個(gè)新開(kāi)源項(xiàng)目,這是一個(gè)更易于構(gòu)建云原生應(yīng)用的動(dòng)態(tài)服務(wù)發(fā)現(xiàn)、配置管理和服務(wù)管理平臺(tái),在項(xiàng)目開(kāi)發(fā)過(guò)程中,我們經(jīng)常使用nacos作為配置中心和注冊(cè)中心。本文章我們就從代碼層面研究下springboot是如何整合nacos使用的
    2022-07-07
  • XXL-Job端口額外占用問(wèn)題的解決方法小結(jié)

    XXL-Job端口額外占用問(wèn)題的解決方法小結(jié)

    最近博主在Spring整合XXL-JOB到項(xiàng)目時(shí)發(fā)現(xiàn)了個(gè)問(wèn)題,注冊(cè)執(zhí)行器需要額外占用端口,也就是我們每啟動(dòng)一個(gè)程序,除了程序本身的API端口外,還需要額外開(kāi)放一個(gè)執(zhí)行器端口,所以本文給大家分享了XXL-Job端口額外占用問(wèn)題的解決方法小結(jié),需要的朋友可以參考下
    2024-05-05

最新評(píng)論

叶城县| 尉犁县| 罗城| 重庆市| 沽源县| 湄潭县| 松溪县| 依兰县| 静宁县| 抚顺县| 河间市| 嘉祥县| 甘孜县| 阿荣旗| 海门市| 唐河县| 长海县| 蚌埠市| 攀枝花市| 化州市| 营山县| 都匀市| 佛山市| 湘潭县| 南川市| 延津县| 密山市| 宝坻区| 屏山县| 汝城县| 通许县| 石景山区| 邯郸县| 固始县| 磴口县| 阿勒泰市| 玉门市| 德化县| 宁河县| 绥宁县| 紫云|