判断对象是否存活的算法
在java中,对象是否存活取决于 finalize()方法,但是不建议重写
1.引用计数算法:每被引用一次,计数器+1
难以解决循环引用的问题,就是假如两个对象互相引用已经不会再被其它其它引用,导致一直不会为0 就无法进行回收
2.可达性算法:搜索所经过的路径称为引用链,当一个对象到GC Roots没有任何引用跟它连接则证明对象是不可用的
①虚拟机栈(栈桢中的本地变量表)中的引用的对象,就是平时所指的java对象,存放在堆中。
②方法区中的类静态属性引用的对象,一般指被static修饰引用的对象,加载类的时候就加载到内存中。
③方法区中的常量引用的对象,
④本地方法栈中JNI(native方法)引用的对象
判断完对象是否存活后,收集垃圾的算法
举个形象的例子:假如有100人出生在Eden区,这100人慢慢长大,赚钱发家致富,进入到S0区,GC在区域空间逐渐满的时候会不定期的来调查每个人的价值,于是,把60个有价值的人克隆送到了S1区,S0区的所有生命都干掉,就这样过了一断时间,GC又来S1区调查60个人的价值,发现只有20人有价值,于是又复制到了S0区,S1区的所有都干掉,就这样,周而复始,在这周而复始的期间,有的一直存活,活到了15岁,于是把它放到了老年代区域。
1.标记/清除算法【最基础】
Minor GC
发生于 新生代 eder区
2.复制算法
3.标记/整理算法
jvm采用`分代收集算法`对不同区域采用不同的回收算法。