jvm垃圾回收機制GC

題目不知道對不對,開始寫:----

我看的他的https://www.cnblogs.com/yb38156/p/9416751.html

哪些內存需要回收?什麼時候回收?如何回收?這也是經典的學習一個知識點的3h方法:what? when? how?

看啊看

一。幾種常見的垃圾收集算法

  1、Mark-Sweep

  標記-清除算法,分爲標記,清除兩個階段,首先標記出所有需要回收的對象,標記完成後統一回收

  不足:效率不高;回收後產生大量不連續的內存碎片。碎片太多的話,需要分配大對象時,無法找到足夠的連續內存而不得不提前觸發新一輪的垃圾收集動作

  2、Copying

  複製算法,大多商業虛擬機都採用這種收集算法回收新生代,具體的在第三點內存分配會講到

  3、Mark-Compact

  標記-整理算法。一般使用於老年代

  4、Generational Collection

  分代收集算法。當前商業虛擬機的垃圾收集都採用分代收集算法,一般是把Java堆分爲新生代和老年代,根據各自特點採用最適當的收集算法。

二。(有用的來了)內存分配與回收策略

Java的自動內存管理機制可以歸結爲解決了兩個問題:給對象分配內存以及回收分配給對象的內存。Java的內存分配策略並不是絕對的或者固定的,這取決於

當前使用的垃圾收集器組合,以及虛擬機中與內存分配相關的參數設置,接下來講的是最爲普遍的內存分配規則

1)對象優先在Eden區分配

  新生代區域一般被分爲較大的Eden空間和兩塊較小的Survivor空間(通常稱爲From和To),HotSpot虛擬機默認Edon和兩個Survivor的大小比例是8:1:1,

新創建的對象一般會在Edon和From中,當Edon區沒有足夠的空間進行分配時,將觸發一次Minor GC,前面講過大多數對象是朝生夕死的,因此Minor GC非常頻繁

當一次Minor GC過後,仍然存活的對象會一次性複製到To區域中,然後清理掉Edon和From;這時候注意,From和To將交換角色,現在新的To是清理後的From

因此To區域總能保證每次Minor GC後留有一定的空間容納尚存活的對象

  (2)長期存活的對象將進入老年代

  虛擬機給每個對象都定義了一個對象年齡(Age)計數器,在Edon出生的對象經過第一次Minor GC後仍然存活,並能在Survivor容納的話Age將設爲1,在Survivor區

每熬過一次Minor GC,Age+1,當Age達到設置的參數值-XX:MaxTenuringThreshold(默認值15),將晉升老年代,關於晉升老年代的條件並非一定要達到這種情況,

java虛擬機有動態對象年齡判定策略,具體可閱讀本書3.6.4細節

  (3)大對象直接進入老年代

  所謂大對象指的是需要大量連續內存空間的對象,最典型的如很長的字符串以及數組,經常出現大對象意味着很可能內存中還有不少空間時就得提前觸發垃圾收集

以獲取足夠的連續空間來安置他們。

  (4)觸發Full GC的條件

  Full GC的速度一般比Minor GC慢10倍以上,觸發一次Full GC經常會伴隨一次Minor GC,一種觸發條件爲,一次Minor GC發生後將要晉升爲老年代的對象大小超過

老年代現有剩餘空間大小,這種情形不難想象。java的老年代空間分配擔保細節可細讀3.6.5節知曉,此處不再細說

最後上圖一張作爲結尾,一目瞭然(真的嗎):


 

看完了吧,果然還是不會吧,持續學習。。。道路阻且長,而且沒場景,拘說還需要jconsole,jstack啥的,還有一個人問我服務器cpu變高怎麼搞,會了還用你來面我,算了吧,

讓他裝波逼吧,擦,學起來

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章