3问:什么要回收,什么时候回收,怎么回收
判断对象要回收的算法:
1引用计数算法:添加计数器,如果被引用+1,引用失效-1,计数为0的对象可以被回收。(但主流jvm采用的不是该方法,原因;很难解决循环引用问题)
2可达性分析算法:原理:创造GC root对象,可回收的对象为与GC root 无直接和间接引用的对象
java中可作为GC root的对象:
虚拟机栈中的引用对象;
方法区中类静态属性应用引用对象;
方法去中常量引用对象;
本地栈 被native方法修改的引用对象;
java 中的回收流程:gc回收->发现可回收对象->执行finalize()(only one) ->是否被引用->是:不回收;否:回收
一般垃圾收集算法:
1标记-清除算法:
将标记为可回收的对象清除
存在问题效率低,占用空间大
2复制算法:
将内存一分为2,每次可回收的对象清理后,将剩余的对象按顺序放到另一半;
优点:提高了效率;缺点:内存减半
应用:回收新生代(特点:98%会死),将内存分为1大Eden2小Survivor,默认8:1:1;新对象放eden,将eden回收后的对象放在一个Survivor,下次回收eden+Survivor的对象,剩余对象放在另一个Survivor,以此类推;
3标记整理算法
应对老年代对象(特点:存活率高),在标记完成后,存活对象向一段移动,完成后清除边界外的对象
4分代收集算法:根据对象的活动周期将对象分为新生代,老年代;新生代使用复制算法,老年代使用标记-清除/整理算法