1. 程式人生 > >垃圾回收的概念與算法

垃圾回收的概念與算法

還要 無法 次數 回收算法 串行 引用 from 標記壓縮 高效

GC中的垃圾,是指的是在內存中不在不再被使用的對象。

常見的垃圾回收算法

1.引用計數算法(無法回收循環引用的對象)

2.標記清除算法
分為標記階段和清除階段(會產生內存的空間碎片)

3.復制算法(缺點是將系統內存折半,高效性是建立在存活對象少,垃圾對象多的前提下的)

在java新生代串行垃圾回收器中,使用了復制算法的思想,新生代分為eden,from,to三個部分。from,to空間成為survivor空間,用於存放未被回收的對象。

其中:新生代指得是存放年輕對象的空間。

老年代指的是存放垃圾回收存活的對象。

在新生代中的垃圾回收中,eden區存活的對象會放在to中,正在使用from中的年輕對象也會被復制到to中,此時eden區與from區可以直接清空。

4.標記壓縮法(高效性是建立在大多數的對象都是存活的)

用於老年代中的垃圾回收:

在標記清除算法中做了優化:從根節點開始,對所有可達對象做了標記。然後將所有的可達對象都壓縮到內存的另一邊,之後清理邊界外的所有空間。

5.分代算法:

就是將復制算法與標記壓縮法整合到一起。

6.分區算法:

將整個內存的對空間劃分為連續的不同的小空間,每個小空間都單獨的使用,獨立的回收。由於對空間越大,一次GC所花費的時間越長,所以會減少GC的時間。

對象回收的情況

java提供了四個類型的引用:強引用,軟引用,弱引用,虛引用。

強引用所指的對象在任何時候都不會被GC回收。

2.GC未必會回收軟引用的對象嗎,但是當內存資源緊張時,軟引用的對象會被回收。

3.在GC中還要發現弱引用就會被回收。

4.一個虛引用隨時隨地都會被回收。

新生代與老年代GC的區別:

新生代GC比較頻繁,但是持續的時間較短。

老年代GC發生次數少,但是持續的時間比較長。

垃圾回收的概念與算法