天天看點

java中的GC(gc工作原理,GC回收機制,GC記憶體配置設定)

收集算法是記憶體回收的方法論,垃圾收集器是記憶體回收的具體實作。

自動記憶體管了解決的是:給對象配置設定記憶體 以及 回收配置設定給對象的記憶體。

為什麼我們要了解學習GC與記憶體配置設定呢?

在JVM自動記憶體管理機制下,不再需要為每一個new操作寫配對的delete/free代碼。但出現記憶體洩露和溢出問題時,如果不了解虛拟機是怎樣使用記憶體的,那麼排查錯誤将是一項非常艱難地工作。

GC(垃圾收集器)在對堆回收前,會先确定哪些對象“存活”,哪些已經“死去”。那麼就有了 對象存活判定算法。

對象存活判定算法

1:引用技術算法:

優點:實作簡單,判斷效率也很高。

缺點:很難解決對象之間互相循環引用的問題。

2:可達性分析算法

生存還是死亡?

如果對象在進行可達性分析後發現沒有與 GC Roots相連接配接的引用鍊,那它将會被第一次标記并且進行一次篩選,篩選的條件是此對象是否有必要執行finalize() 方法,當對象沒有覆寫finalize()方法,或者finalize()方法已經被虛拟機調用過,

垃圾回收算法

1:标記—清除算法:

2:複制算法:

3:标記—整理算法:

4:分代收集算法:

記憶體配置設定與回收政策

對象優先在新生代Eden區中配置設定。當Eden區沒有足夠空間進行配置設定時,虛拟機将一次Minor GC。

長期存活的對象将進入老年代:虛拟機采用了分代收集的思想來管理記憶體,那麼記憶體回收時就必須能識别那些對象應放在新生代,那些對象應放在老年代,為了做到這點,虛拟機給每個對象定義了一個對象年齡計數器。如果對象在Eden處并經過第一次Minor GC後仍然存活,并且能被Survivor容納的話,将被移動到Survivor空間中,并且對象年齡設為1,對在Survivor區中每“熬過”一次Minor GC,年齡就增加1歲,當它的年齡增加到一定程度,就将會被晉升到老年代。

動态對象年齡判斷:虛拟機并不是永遠要求對象的年齡必須達到了Max Tenuring Threashold 才能晉升老年代,如果在Survivor空間中相同年齡所有對象大小的總和大于Survivor空間的一半,年齡大于或等于該年齡的對象就可以直接進入老年代,無須等到Max Tenuring Threshold 中要求的年齡。

空間配置設定擔保:在發生Minor GC之前,虛拟機會先檢查老年代最大可用的連續空間是否大于新生代所有對象總空間,如果這個條件成立,那麼Minor GC可以確定是安全的。如果不成立,則虛拟機會檢視HandlePromotionFailure設定值是否允許擔保失敗。

作者:weixin_39027589

來源:CSDN

原文:https://blog.csdn.net/weixin_39027589/article/details/81262801

上一篇: C#托盤程式
下一篇: C#程式打包