
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
昆明达内培训的小编今天分享判断对象是否可以被回收(判别算法或搜索算法)。
下面的算法回答了who的问题。
1.1引用计数法
每个对象创建的时候,会分配一个引用计数器,当这个对象被引用的时候计数器就加1,当不被引用或者引用失效的时候计数器就会减1。任何时候,对象的引用计数器值为0就说明这个对象不被使用了,就认为是“垃圾”,可以被GC处理掉。
评价:
【优点】算法实现简单。
【缺点】不能解决对象之间循环引用的问题。有垃圾对象不能被正确识别,这对垃圾回收来说是很致命的,所以GC并没有使用这种搜索算法。
1.2根搜索算法
以一些特定的对象作为基础原始对象,或者称作“根”,不断往下搜索,到达某一个对象的路径称为引用链。
如果一个对象和根对象之间有引用链,即根对象到这个对象是可到达的,则这个对象是活着的,不是垃圾,还不能回收。例如,假设有根对象O,O引用了A对象,同时A对象引用了B对象,B对象又引用了C对象,那么对象C和根对象O之间的路径的可达的,C对象就不能当做垃圾对象。引用链为O->A->B->C。
反之,如果一个对象和根对象之间没有引用链,根对象到这个对象的路径是不可达的,那么这个对象就是可回收的垃圾对象。
评价:
【优点】可找到所以得垃圾对象,并且完美解决对象之间循环引用的问题。
【缺点】不可避免地要遍历全局所有对象,导致搜索效率不高。
根搜索算法是现在GC使用的搜索算法。
可以当做GC roots的对象有以下几种:
虚拟机栈中的引用的对象。(java栈的栈帧本地变量表)
方法区中的类静态属性引用的对象。
方法区中的常量引用的对象。(声明为final的常量对象)
本地方法栈中JNI的引用的对象。(本地方法栈的栈帧本地变量表)
GC ROOTS就是跟对象节点,蓝色的是可达的引用链,引用链上的对象是活着的,不能被当做垃圾对象回收。相反暗灰色的路径表示不可达的路径,这些对象将会被回收。每个圈圈里面的数字,表示其被引用的次数,没错,就是上面说到的引用计数法的计数值。