一区二区三区电影_国产伦精品一区二区三区视频免费_亚洲欧美国产精品va在线观看_国产精品一二三四

聯(lián)系我們 - 廣告服務(wù) - 聯(lián)系電話:
您的當前位置: > 關(guān)注 > > 正文

世界今熱點:躲過15次GC之后 進入老年代系統(tǒng)有哪些規(guī)則?

來源:CSDN 時間:2023-03-30 16:07:54

1.躲過15次GC之后進入老年代

系統(tǒng)剛啟動時,創(chuàng)建的各種各樣的對象,都是分配在年輕代里。隨著慢慢系統(tǒng)跑著跑著,年輕代滿了,就會出發(fā)Minor GC ,可能1%的少量存活對像轉(zhuǎn)移到空著的Survivor區(qū)中,然后系統(tǒng)繼續(xù)運行,繼續(xù)在Eden區(qū)里分配對象........,類似靜態(tài)變量等引用的對象,可能存活時間會久一些,無論年輕代中怎么垃圾回收,類似這種對象都不會被回收掉。而此對象每次在年輕代里躲過一次Minor GC被轉(zhuǎn)移到一塊Survivor區(qū)域中,他的年齡就會增加一歲,默認的設(shè)置下,當對象的年齡達到15歲時,也就是躲過15次GC的時候,他就會轉(zhuǎn)移到老年代里去,具體是多少歲進入老年代,可以通過JVM參數(shù)“-XX:MaxTenuringThreshold”來設(shè)置,默認是15歲


【資料圖】

2.動態(tài)對象年齡判斷

這里跟這個對象年齡有另外一個規(guī)則可以讓對象進入老年代,不用等到15次GC過后才可以。

假設(shè)這個圖中的Survivor2區(qū)有兩個對象,這倆對象的年齡一樣,都是2歲,然后倆對象加起來內(nèi)存超過了50MB,這個時候,Survivor2區(qū)里大于等于2歲的對象,都要進入老年代里去。這就是動態(tài)年齡判斷的規(guī)則,這條規(guī)則也會讓一些年輕代的對象進入老年代,另外實際這個規(guī)則運行的時候是如下的邏輯:年齡1+年齡2+年齡n的多個年齡對象總和超過了Survivor區(qū)的50%,此時就會把年齡n以上的對象都放入老年代。

3.大對象直接進入老年代

有一個JVM參數(shù),就是“-XX:PretenureSizeThreshold”,可以把它的值設(shè)置為字節(jié)數(shù),比如“1048576”字節(jié),就是1MB,意思就是如果你要創(chuàng)建一個大于這個大小的對象,比如一個超大的數(shù)組,或者是別的啥東西,此時就直接把這個大對象放到老年代里去,壓根不會經(jīng)過年輕代。之所以這么做,是因為要避免年輕代里出現(xiàn)那種大對象,然后屢次躲過GC,還得把他在兩個Survivor區(qū)域里來回復(fù)制多次之后才能進入老年代。所以說這也是一個對象進入老年代的規(guī)則

4.Minor GC后的對象太多,無法放入Survivor區(qū)

如圖所示:

這個時候就必須得把這些對象直接轉(zhuǎn)移到老年代去!

5.老年代空間分配擔(dān)保規(guī)則

如果年輕代里大量對象存活,確實自己的Survivor區(qū)放不下了,必須轉(zhuǎn)移到老年代去

但是如果老年代里空間也不夠放這些對象,改怎么辦呢?

首先,在執(zhí)行任何一次Minor GC之前,JVM都會先檢查一些老年代可用的內(nèi)存空間,是否大于年輕代所有對象的總大小,為什么呢?因為最極端的情況下,可能年輕代Minor GC之后,所有對象都存活下來了,那豈不是年輕代所有對象全部進入老年代

如果說發(fā)現(xiàn)老年代內(nèi)存大小是大于年輕代所有對象的,此時就可以放心大膽地對年輕代發(fā)起一次Minor GC了。

但是假如執(zhí)行Minor GC之前,發(fā)現(xiàn)老年代的可用內(nèi)存已經(jīng)小于了年輕代的全部對象大小了

恰好這個時候Minor GC之后年輕代的對象全部存活下來,全部需要轉(zhuǎn)移到老年代中去,但是老年代內(nèi)存空間又不夠?

所以假如Minor GC之前,發(fā)現(xiàn)老年代的可用內(nèi)存已經(jīng)小于了年輕代的全部對象大小,就會看一個“-XX:-HandlePromotionFailure”的參數(shù)是否設(shè)置了

如果有這個參數(shù),那么就會看看老年代的內(nèi)存大小,是否大于之前每一次Minor GC后進去老年代對象的平均大小

但是如果上面步驟判斷失敗了,或者是“-XX:-HandlePromotionFailure”參數(shù)沒設(shè)置,此時就會直接觸發(fā)一次“Full GC”,

就是對老年代進行垃圾回收,盡量騰出來一些內(nèi)存空間,然后再執(zhí)行Minor GC。

如果上面兩個步驟判斷成功,那么就可以嘗試Minor GC,此時進行Minor GC有幾種可能:

①Minor GC過后,剩余的存活對象的大小,小于Survivor區(qū)的大小,那么此時存活對象進入Survivor區(qū)即可

②Minor GC過后,剩余的存活對象的大小,大于Survivor區(qū)的大小,但是小于老年代可用內(nèi)存大小,就直接進入老年代即可

③Minor GC過后,剩余的存活對象的大小,大于Survivor區(qū)的大小,同時大于老年代可用內(nèi)存大小,此時就會發(fā)生“Handle Promotion Failure”的情況,這個時候就會出發(fā)一次“Full GC”。

Full GC就是對老年代進行垃圾回收,同時也一般會對年輕代進行垃圾回收。

如果Full GC之后,老年代還是沒有足夠空間存放Minor GC過后的剩余存活對蝦,此時就會導(dǎo)致所謂的“OOM”內(nèi)存溢出了

所以,所謂的JVM優(yōu)化,就是盡可能的讓對象都在年輕代里分配和回收,盡量別讓太多對象頻繁進入老年代,避免頻繁對老年代進行垃圾回收,同時給系統(tǒng)充足的內(nèi)存大小,避免年輕代頻繁的進行垃圾回收。

責(zé)任編輯:

標簽:

相關(guān)推薦:

精彩放送:

新聞聚焦
Top 主站蜘蛛池模板: 文成县| 北海市| 玛沁县| 高陵县| 肥东县| 新民市| 西吉县| 资中县| 右玉县| 扶风县| 九龙县| 临泽县| 黄龙县| 绥芬河市| 准格尔旗| 天气| 麻城市| 新邵县| 英德市| 谷城县| 太仓市| 怀来县| 石渠县| 高尔夫| 和龙市| 勐海县| 元朗区| 郯城县| 资溪县| 独山县| 比如县| 崇左市| 平南县| 巴青县| 普兰县| 霸州市| 墨玉县| 大悟县| 新和县| 海城市| 托克逊县|