3問:什么要回收歹河,什么時候回收论寨,怎么回收
判斷對象要回收的算法:
1引用計數(shù)算法:添加計數(shù)器,如果被引用+1胞锰,引用失效-1灾锯,計數(shù)為0的對象可以被回收。(但主流jvm采用的不是該方法,原因;很難解決循環(huán)引用問題)
2可達性分析算法:原理:創(chuàng)造GC root對象嗅榕,可回收的對象為與GC root 無直接和間接引用的對象
java中可作為GC root的對象:
虛擬機棧中的引用對象顺饮;
方法區(qū)中類靜態(tài)屬性應(yīng)用引用對象;
方法去中常量引用對象凌那;
本地棧 被native方法修改的引用對象兼雄;
java 中的回收流程:gc回收->發(fā)現(xiàn)可回收對象->執(zhí)行finalize()(only one) ->是否被引用->是:不回收;否:回收
一般垃圾收集算法:
1標記-清除算法:
將標記為可回收的對象清除
存在問題效率低帽蝶,占用空間大
2復(fù)制算法:
將內(nèi)存一分為2赦肋,每次可回收的對象清理后,將剩余的對象按順序放到另一半励稳;
優(yōu)點:提高了效率佃乘;缺點:內(nèi)存減半
應(yīng)用:回收新生代(特點:98%會死),將內(nèi)存分為1大Eden2小Survivor驹尼,默認8:1:1趣避;新對象放eden,將eden回收后的對象放在一個Survivor,下次回收eden+Survivor的對象,剩余對象放在另一個Survivor,以此類推新翎;
3標記整理算法
應(yīng)對老年代對象(特點:存活率高)程帕,在標記完成后住练,存活對象向一段移動,完成后清除邊界外的對象
4分代收集算法:根據(jù)對象的活動周期將對象分為新生代骆捧,老年代澎羞;新生代使用復(fù)制算法,老年代使用標記-清除/整理算法