jvm的幾種垃圾回收策略

jvm的垃圾回收主要是針對java堆這塊內存空間,因爲java的虛擬棧是隨着線程的銷燬而自動回收的,而方法區的垃圾回收條件極其苛刻。

java堆中存放着運行期間的對象實例,隨着程序的運行實例越來越多,不回收垃圾就會產生OOM異常,而怎麼判斷一個對象是否是垃圾呢,下面是幾種常用的垃圾判別法。

1引用計數法

    基本想法就是 一個對象,如果有地方在引用它,那麼它就不是垃圾,因此呢,我給這個對象創建一個引用計數器,對象 被引用一次,計數器就+1,引用失效,計數器-1,垃圾回收的時候一看這個對象計數器值爲0,說明這個對象沒被引用了,就被當作垃圾回收了。這個算法非常高效,但是存在的問題就是兩個對象互相引用,這樣這兩個對象就永遠無法被回收。

2根搜索法

    這個方法的基本思路是,從一些根節點,稱爲“GC Roots”,爲起始點往下搜索,形成一條引用鏈,在引用鏈之外的對象被視作垃圾。java語言中的“GC Roots”有如下幾種:幀棧中本地變量表中引用的對象、方法區中類靜態屬性引用的對象、方法區中常量引用的對象、本地方法棧中JNI引用的對象。

在jvm的垃圾回收實現中經常會使用如下的算法

1 標記清除算法

在這種回收機制中,分爲兩個過程,一是標記,再就是清除,標記階段就是用根搜索法來判斷對象是否需要回收,清除就是回收內存空間。這個算法是垃圾回收中最基本的算法,許多高級的垃圾回收算法都是根據它爲基礎。這個算法的缺點是效率低,回收後的內存空間過於碎片化。

2 複製算法

針對標記清除算法的效率問題,複製算法給出的解決方法是,將內存空間一分爲二,每次只用其中一塊空間,當進行垃圾回收時,把活着的對象複製到另一塊空間中,清除時將原空間全部清除,這樣效率既高也解決了內存碎片,缺點就是太廢內存了。

3 標記整理算法

過程和標記清除算法類似,區別就是它不直接把垃圾空間清除掉,而是將活着的對象都移動到一起,剩下的空間就是垃圾空間了,這時候直接清除掉就行。

4 分代回收算法

分代回收法就是根據對象的生存週期,分爲老年代和新生代兩個內存空間,對於新生代這種對象生成和死亡都比較快的區域使用複製算法進行回收,對於老年代則使用標記清除或標記整理算法。

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