垃圾回收的概念與算法
阿新 • • 發佈:2017-05-13
還要 無法 次數 回收算法 串行 引用 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發生次數少,但是持續的時間比較長。
垃圾回收的概念與算法