jvm 垃圾回收概念和算法
1、概念
GC 中的垃圾,特指存在於內存中、不會再被使用的對象。垃圾回收有很多種算法,如引用計數法、復制算法、分代、分區的思想。
2、算法
1、引用計數法:對象被其他所引用時計數器加 1,而當引用失效時則減 1,。但這種方式有非常嚴重的問題:無法處理循環引用的情況、還有就是每次進行加減操作比較浪費性能。
2、標記清除法:就是分為標記和清除兩個階段進行處理內存中的對象,當然這種方式也有非常大的弊端,就是空間碎片問題,垃圾回收後的空間不是連續的,不連續的內存空間工作效率要低於連續的內存空間 ( java 中新生代的 from 和 to 空間就是使用的復制算法 )
3、復制算法:其核心思想就是將內存分為兩塊,每次只使用一塊,在垃圾回收時,將正在使用的內存中的存留對象復制到未被使用的內存中去,之後清除之前使用內存中的對象,反復去交換兩個內存的角色,完成垃圾回收。
4、標記壓縮法:標記壓縮法在標記清除法基礎上做了優化,把存活的對象壓縮到內存一端,然後進行垃圾清理。( java 中老年代就是使用的標記壓縮法 )
5、分代算法:根據對象的特點把內存份為 n 塊,然後根據每個內存的特點使用不同的算法。對新生代和老年代來說,新生代回收頻率高,但每次耗時短,而老年代回收頻率低,但耗時相對較長,所以應當盡量減少老年代的 GC。
6、分區算法:將整個內存分為 n 個獨立空間,每個小空間都可以獨立使用,這樣細粒度的控制一次回收多少個小空間和哪些空間,而不是對整個空間進行 GC,從而提升性能,並減少 GC 的停頓時間。
3、為什麽新生代和老年代使用不同的算法
新生代裏面的對象死得快、死的多,所以采用復制算法可以一次性大批量 GC
老年代裏面的對象死的少、死的慢,所以采用標記壓縮法一次性小批量 GC
jvm 垃圾回收概念和算法