知識鋪: 致力于打造輕知識點,持續更新每次的知識點較少,閱讀不累。不占太多時間,不停的來喚醒你記憶深處的知識點。
GC算法
1.標記清除算法
優缺點:不需要額外空間,但是遍歷空間花費大,而且會產生大量內存碎片
2.復制收集算法
占用兩塊一樣大內存,每次只用使用一塊。當需要發生復制的時候,遍歷一遍可達對象,進行復制到另外一塊內存中。From區轉移到To區,或把一下gc次數超過閾值的,轉移大Old區。原先的From區,整個清空。
優點:只需要遍歷一遍
缺點:復制成本巨大、占用內存多
3.標記整理算法
3.1 采用標記-清除算法一樣的方式進行對象的標記
3.2 采用復制清除算一樣將所有的存活對象往左端空閑空間移動
3.3 在一塊內存上操作,避免產生碎片
優缺點:相對標記清除來說,沒有了內存碎片,但是遍歷花費仍然很大。
4. GC根據堆內存空間不同區域,采用不同的算法回收
4.1 Young區: 復制收集算法
原因:對象較少,復制代價小
4.2 老區和方法區:標記清除或標記整理算法
原因:對象存活較多,次數少,較慢
其他知識點:
一、GC 根
1.棧中引用的對象
2.方法區中的靜態成員
3.方法區中常量引用的對象 全局變量
4.本地方法棧中JNI 本地Native方法
二、可到達性分析
1.從任意根對象到某個對象均不可達時,這個對象就可以被回收。 日常開發中,經常碰到某個大對象,也就是臨時使用下,然后拋棄。這個時候可以有個好習慣,就是用完后賦值 null。可能不會立即被gc掉,但是有助于計算。
2. 當一個對象不在引用鏈上,這個時候可能想象成一張圖,對于孤島中的對象,就可以gc掉。
三、實際中 JVM的gc算法
1. 分代收集算法, 區分出 新生代GC 和 老年代GC
2. 新生代 適合復制算法,這個區對象生產太頻繁,相應的GC也頻繁,使用這種空間換時間的收集算法比較合算。
3. 老年代 適合標記清理或標記整理,這個區的對象成活率高,GC不需要很頻繁。
四、可觸及性
可觸及的
可復活的
不可觸及的
本文由zshipu.com學習筆記或整理或轉載,如有侵權請聯系,必改之。