在Java中通过引用来和对象进行关联的,也就是说如果要操作对象,必须通过引用来进行。那么很显然一个简单的办法就是通过引用计数来判断一个对象是否可以被回收。不失一般性,如果一个对象没有任何引用与之关联,则说明该对象基本不太可能在其他地方被使用到,那么这个对象就成为可被回收的对象了。这种方式成为引用计数法。
工作流程:
1. 垃圾回收器,在运行的时候会给存储在内存中的所有变量都加上标记。
2. 去掉环境中的变量以及被环境中的变量引用的变量的标记。
3. 再被加上标记的会被视为准备删除的变量。
4. 垃圾回收器完成内存清除工作,销毁那些带标记的值并回收他们所占用的内存空间。
public
class
Main {
public
static
void
main(String[] args) {
MyObject object1 =
new
MyObject();
MyObject object2 =
new
MyObject();
object1.object = object2;
object2.object = object1;
object1 =
null
;
object2 =
null
;
}
}
class
MyObject{
public
Object object =
null
;
}
垃圾回收机制的算法
1.Mark-Sweep(标记-清除)算法:直接在内存里标记无用对象,然后直接回收
缺点:形成内存碎片
2.Copying(复制)算法
将内存划分为大小相等的两
块,当一块的内存用完了,就讲还存活的对象复制到另外一块上面,然后将之前的那块清理掉
缺点:浪费内存太多(对老年代的使用,效率低)
第三种:标记-整理算法
将存活的对象都向一端移动,然后直接清理掉端边界以外的内存
第四种:分代收集算法:(当前商业虚拟机都采用这个哦)
根据对象的存活中期的不同将内存划分为几块,一般java堆分为新生代和老年代
新生代:用复制算法
老年代用标记整理算法进行回收