一.垃圾回收的两个方法
1.引用计数算法
对象添加计数器,被引用一次计数器自加1,当引用失效计数器减1,当计数器为0的时候,
对象就是处于可以回收的状态。(也就是不可用的状态)
这个计数算法的好处就是实现简单。坏处就是当有两个对象相互引用,GC收集就会失败。
2.根搜索算法
根搜索算法这个就是 GC Roots对象作为起点,然后形成一个引用链(Reference Chain)
如果对象不再这个引用链上(不可达)将会被认为是可回收的对象
二.GC回收的对象以及几个引用
GC回收的对象
1.虚拟机栈中所引用的对象。(堆中的对象)
2.方法区中的静态变量。
3.方法区中的常量。
4.Native方法中的引用对象。
引用的类型(由强到弱)
1.强引用:new出来的对象
2.软引用:可有可无的引用,SortReference类实现
3.弱引用:非必要对象,只能生存到下一次GC前,通过WeakReference来实现
4.虚引用:一个对象的生存跟虚引用没关系,构不成影响,作用就是GC前的一次系统通知
三.对象的存亡
首先如果是不可达的对象,那就被缓刑了,至少经历两次标记然后就会被GC。(没有覆盖finalize方法)
如果finalize方法中有机会返回引用链那么对象就逃逸了(finalize只能被执行一次,就是对象自救只能一次)
逃逸不了就真的要死刑了
四.方法区的垃圾回收
1.废弃常量的回收,这个跟Java堆中的回收方法差不多,只要没有被引用就有可能会被GC。
2.无用类的回收,这个回收条件就相当的苛刻,首先判断它是可回收的(下面三个步骤)
2.1类中的生成的实例都被回收
2.2加载该类的ClassLoader已经被回收
2.3该类已经完全没有被引用(反射等)
满足上面三个条件这个类只是可以被回收
五.垃圾回收算法
1.标记清除算法:先标记要回收的对象,然后收集。
缺点:1.标记与清除的效率都不高。2.产生大量的内存碎片。
2.复制算法:分为Eden:Survivor from:Survivor to = 8:1:1(新生代的比例)新生代
Eden与from这两个是用来保留新对象的,GC后Eden存活的对象就会到to,
而from存活的就会“老一岁“(标志加1)。到达阈值就会移进老年代。(而且老年代会
做出分配担保)
3.标记整理算法:就是标记清除的改进,还多了整理,使得不会产生许多内存碎片。
4.分代收集算法:分为老年代与新生代,各代的收集算法都不一样。
参考:深入理解java虚拟机