欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

JVM內(nèi)存逃逸原理是什么

本篇內(nèi)容主要講解“JVM內(nèi)存逃逸原理是什么”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“JVM內(nèi)存逃逸原理是什么”吧!

創(chuàng)新互聯(lián)公司主營(yíng)浮梁網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,手機(jī)APP定制開(kāi)發(fā),浮梁h5小程序開(kāi)發(fā)搭建,浮梁網(wǎng)站營(yíng)銷(xiāo)推廣歡迎浮梁等地區(qū)企業(yè)咨詢(xún)

前提概要

JVM的內(nèi)存分配主要在是運(yùn)行時(shí)數(shù)據(jù)區(qū)(Runtime Data Areas),而運(yùn)行時(shí)數(shù)據(jù)區(qū)又分為了:方法區(qū),堆區(qū),PC寄存器,Java虛擬機(jī)棧(就是棧區(qū),官方文檔還是叫Java虛擬機(jī)棧),本地方法區(qū)內(nèi)存逃逸主要是對(duì)象的動(dòng)態(tài)作用域的改變而引起的,故而內(nèi)存逃逸的分析就是分析對(duì)象的動(dòng)態(tài)作用域

方法逃逸

  • 什么是方法逃逸呢?舉個(gè)栗子,在一個(gè)方法中定義一個(gè)對(duì)象后(方法內(nèi)局部的),這個(gè)對(duì)象被外部方法引用,比如作為返回值返回傳遞到其他的地方,當(dāng)這個(gè)方法執(zhí)行結(jié)束要進(jìn)行GC時(shí),這個(gè)方法中的對(duì)象本應(yīng)該被回收,卻發(fā)現(xiàn)該對(duì)象還是存活狀態(tài)沒(méi)法回收,就稱(chēng)為方法逃逸

上代碼

public static StringBuffer getStringBuffer(String str1,String str2) {
    StringBuffer stringBuffer = new StringBuffer();
    stringBuffer.append(str1);
    stringBuffer.append(str2);
    return stringBuffer;
}

上面的代碼中的stringBuffer雖然是方法內(nèi)的局部變量因?yàn)閟tringBuffer被當(dāng)作返回值返回,這樣stringBuffer可能被其他的方法所改變,作用域就不僅僅在本方法內(nèi)啦,這樣就是逃逸到了方法外部。對(duì)的,就是越獄了。

  • 怎么樣才能不讓stringBuffer逃出方法呢?那么不直接返回stringBuffer對(duì)象不就可以了嘛!如下面的代碼:

public static StringBuffer getStringBuffer(String str1,String str2) {
    StringBuffer stringBuffer = new StringBuffer();
    stringBuffer.append(str1);
    stringBuffer.append(str2);
    return stringBuffer.toString();
}
  • 線(xiàn)程逃逸:上面的例子,直接將對(duì)象返回,該對(duì)象可能被外部線(xiàn)程訪(fǎng)問(wèn),如:賦值給類(lèi)變量等,稱(chēng)為線(xiàn)程逃逸。

總的來(lái)說(shuō)就是一個(gè)對(duì)象的指針被多個(gè)方法或者線(xiàn)程引用時(shí),我們就稱(chēng)這個(gè)對(duì)象的指針發(fā)生了逃逸。

優(yōu)化:即證明一個(gè)對(duì)象不會(huì)逃逸到方法或線(xiàn)程外。

棧上分配:

在堆空間上進(jìn)行內(nèi)存分配,GC在堆空間上篩選可回收的對(duì)象,回收對(duì)象,整理內(nèi)存都需要浪費(fèi)時(shí)間,若能通過(guò)逃逸分析確定某些對(duì)象是一定不會(huì)逃逸出方法之外的,就可以直接讓這個(gè)對(duì)象在棧上分配內(nèi)存,該對(duì)象隨方法的執(zhí)行結(jié)束棧幀出棧而銷(xiāo)毀,減輕了GC的壓力。

同步消除:

線(xiàn)程同步本身比較耗時(shí),若確定了一個(gè)變量不會(huì)逃逸出線(xiàn)程,無(wú)法被其他線(xiàn)程訪(fǎng)問(wèn)到,那這個(gè)變量的讀寫(xiě)就不會(huì)存在競(jìng)爭(zhēng),這個(gè)變量的同步措施就可以清除掉。

標(biāo)量替換:

  • 標(biāo)量:Java中的原始數(shù)據(jù)類(lèi)型(int,char,long等)都不能再進(jìn)一步分解,他們就可以稱(chēng)為標(biāo)量

  • 聚合量:若一個(gè)數(shù)據(jù)可以繼續(xù)分解,那就稱(chēng)之為聚合量,而對(duì)象就是典型的聚合量

若逃逸分析證明一個(gè)對(duì)象不會(huì)逃逸出方法,不會(huì)被外部訪(fǎng)問(wèn),并且這個(gè)對(duì)象是可以被分解的,那程序在真正執(zhí)行的時(shí)候可能不創(chuàng)建這個(gè)對(duì)象,而是直接創(chuàng)建這個(gè)對(duì)象分解后的標(biāo)量來(lái)代替。這樣就無(wú)需在對(duì)對(duì)象分配空間了,只在棧上為分解出的變量分配內(nèi)存即可。

All in all:

逃逸分析是比較耗時(shí)的,所以性能未必提升很多,因?yàn)槠浜臅r(shí)性,采用的算法都是不那么準(zhǔn)確但是時(shí)間壓力相對(duì)較小的算法來(lái)完成的,這就可能導(dǎo)致效果不穩(wěn)定,要慎用

由于HotSpot虛擬機(jī)目前的實(shí)現(xiàn)方法導(dǎo)致棧上分配實(shí)現(xiàn)起來(lái)比較復(fù)雜,所以HotSpot虛擬機(jī)中暫時(shí)還沒(méi)有這項(xiàng)優(yōu)化。OSR暫時(shí)未在Hotspot上執(zhí)行實(shí)現(xiàn)。

相關(guān)的JVM參數(shù):

-XX:+DoEscapeAnalysis開(kāi)啟逃逸分析、 -XX:+PrintEscapeAnalysis開(kāi)啟逃逸分析后,可通過(guò)此參數(shù)查看分析結(jié)果。

-XX:+EliminateAllocations開(kāi)啟標(biāo)量替換-XX:+EliminateLocks開(kāi)啟同步消除-XX:+PrintEliminateAllocations開(kāi)啟標(biāo)量替換后,查看標(biāo)量替換情況

到此,相信大家對(duì)“JVM內(nèi)存逃逸原理是什么”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!

分享文章:JVM內(nèi)存逃逸原理是什么
本文路徑:http://chinadenli.net/article44/ipcphe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航網(wǎng)站策劃全網(wǎng)營(yíng)銷(xiāo)推廣企業(yè)網(wǎng)站制作企業(yè)建站面包屑導(dǎo)航

廣告

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

成都定制網(wǎng)站建設(shè)