本篇內(nèi)容主要講解“JVM內(nèi)存逃逸原理是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“JVM內(nèi)存逃逸原理是什么”吧!
創(chuàng)新互聯(lián)公司主營浮梁網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,手機APP定制開發(fā),浮梁h5小程序開發(fā)搭建,浮梁網(wǎng)站營銷推廣歡迎浮梁等地區(qū)企業(yè)咨詢
JVM的內(nèi)存分配主要在是運行時數(shù)據(jù)區(qū)(Runtime Data Areas),而運行時數(shù)據(jù)區(qū)又分為了:方法區(qū),堆區(qū),PC寄存器,Java虛擬機棧(就是棧區(qū),官方文檔還是叫Java虛擬機棧),本地方法區(qū),內(nèi)存逃逸主要是對象的動態(tài)作用域的改變而引起的,故而內(nèi)存逃逸的分析就是分析對象的動態(tài)作用域。
什么是方法逃逸呢?舉個栗子,在一個方法中定義一個對象后(方法內(nèi)局部的),這個對象被外部方法引用,比如作為返回值返回傳遞到其他的地方,當(dāng)這個方法執(zhí)行結(jié)束要進行GC時,這個方法中的對象本應(yīng)該被回收,卻發(fā)現(xiàn)該對象還是存活狀態(tài)沒法回收,就稱為方法逃逸:
public static StringBuffer getStringBuffer(String str1,String str2) { StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append(str1); stringBuffer.append(str2); return stringBuffer; }
上面的代碼中的stringBuffer雖然是方法內(nèi)的局部變量,因為stringBuffer被當(dāng)作返回值返回,這樣stringBuffer可能被其他的方法所改變,作用域就不僅僅在本方法內(nèi)啦,這樣就是逃逸到了方法外部。對的,就是越獄了。
怎么樣才能不讓stringBuffer逃出方法呢?那么不直接返回stringBuffer對象不就可以了嘛!如下面的代碼:
public static StringBuffer getStringBuffer(String str1,String str2) { StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append(str1); stringBuffer.append(str2); return stringBuffer.toString(); }
線程逃逸:上面的例子,直接將對象返回,該對象可能被外部線程訪問,如:賦值給類變量等,稱為線程逃逸。
總的來說就是一個對象的指針被多個方法或者線程引用時,我們就稱這個對象的指針發(fā)生了逃逸。
優(yōu)化:即證明一個對象不會逃逸到方法或線程外。
在堆空間上進行內(nèi)存分配,GC在堆空間上篩選可回收的對象,回收對象,整理內(nèi)存都需要浪費時間,若能通過逃逸分析確定某些對象是一定不會逃逸出方法之外的,就可以直接讓這個對象在棧上分配內(nèi)存,該對象隨方法的執(zhí)行結(jié)束棧幀出棧而銷毀,減輕了GC的壓力。
線程同步本身比較耗時,若確定了一個變量不會逃逸出線程,無法被其他線程訪問到,那這個變量的讀寫就不會存在競爭,這個變量的同步措施就可以清除掉。
標(biāo)量:Java中的原始數(shù)據(jù)類型(int,char,long等)都不能再進一步分解,他們就可以稱為標(biāo)量。
聚合量:若一個數(shù)據(jù)可以繼續(xù)分解,那就稱之為聚合量,而對象就是典型的聚合量。
若逃逸分析證明一個對象不會逃逸出方法,不會被外部訪問,并且這個對象是可以被分解的,那程序在真正執(zhí)行的時候可能不創(chuàng)建這個對象,而是直接創(chuàng)建這個對象分解后的標(biāo)量來代替。這樣就無需在對對象分配空間了,只在棧上為分解出的變量分配內(nèi)存即可。
逃逸分析是比較耗時的,所以性能未必提升很多,因為其耗時性,采用的算法都是不那么準(zhǔn)確但是時間壓力相對較小的算法來完成的,這就可能導(dǎo)致效果不穩(wěn)定,要慎用。
由于HotSpot虛擬機目前的實現(xiàn)方法導(dǎo)致棧上分配實現(xiàn)起來比較復(fù)雜,所以HotSpot虛擬機中暫時還沒有這項優(yōu)化。OSR暫時未在Hotspot上執(zhí)行實現(xiàn)。
-XX:+DoEscapeAnalysis開啟逃逸分析、 -XX:+PrintEscapeAnalysis開啟逃逸分析后,可通過此參數(shù)查看分析結(jié)果。
-XX:+EliminateAllocations開啟標(biāo)量替換-XX:+EliminateLocks開啟同步消除-XX:+PrintEliminateAllocations開啟標(biāo)量替換后,查看標(biāo)量替換情況。
到此,相信大家對“JVM內(nèi)存逃逸原理是什么”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!