可达性分析算法
这个算法的基础就是:有一系列的GC-Roots作为起始点,从起始点向下搜索。所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链的时候,即说明这个对象不可达的时候,则证明此对象是不可用的。
即使在可达性分析算法中不可达的对象,也并非是非死不可的,这时候他们处于缓刑阶段,要真正宣告一个对象死亡,至少要经历两次标记过程:1)如果对象在可达性分析之后没有发现与GC Roots 相连接的引用链,那么它将会被第一次标记并进行一次筛选:筛选的条件是该对象是否有必要执行finalize()方法,当对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机栈调用过,虚拟机将这两种情况都视为没有必要执行。
如果被标记为有必要执行finalize()方法,那么这个对象将会被放在一个低优先级的队列F-Queue上,并稍后再一个虚拟机自动建立的,低优先级的Finalizer线程执行它,这里所谓的执行是指虚拟机会触发这个方法,但并不承诺会等他运行结束,因为如果有一个对象在finalize()方法中执行缓慢,或者发生了死循环,那么很可能导致F-Queue队列中的其他对象处于永久等待中,对象要在finalize中成功拯救自己只需啊重新与任何一个对象关联即可,譬如把自己赋值给某个对象或者成员变量即可。
垃圾收集算法
标记清除算法
这个算法分为两步一步是标记,一部是清除。首先标记出所有需要回收的对象,然后在标记完成后统一回收所有被标记的对象。缺点:效率不高,会产生大量不连续的内存碎片。
复制算法(一般用于年轻代)
它将可用的内存分为大小相同的两块,每次只使用其中一块,当一块的内存用完了,就将还活着的对象一次性的复制到另一块上面,再把已使用的内存一次性的清理掉。缺点:将内存变为原来的一半。
标记整理算法
将所有存活的对象向一段移动
一般,我们将内存分为一个Eden和两个Survivor区,有两种收集方式:minorGC和FullGC。MinorGC指的是发生在新生代的垃圾收集动作,因为Java对象大多都具有朝生夕灭的特性,发生的次数多,一般回收速度也快。
FullGC:(MajorGC/FullGC):指发生在老年代的GC,比一般的MinorGC慢至少十倍以上。
以下有一些规则:大对象直接进入老年代,超过参数-XX:PretenureSizeThreshold参数的直接进入到老年代,防止在两个Survivor和一个Eden区之间发生大量的内存复制。
长期存活的对象直接进入老年代,-XX:MaxTenuringThreshold=? 如果对象出生在Eden区中并且熬过了一次MinorGC之后并且能被Survivor容纳的话,对象年龄就被设置为1,对象在Survivor区中每熬过一个MinorGC年龄就增加一岁,当增加到一定程度就会直接进入老年代。
动态对象规则判定:如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就直接进入老年代。
-Xms:堆大小的下限 -Xmx:堆大小的最大值 -Xmn新生代的内存大小 -XX:SurvivorRatio=8 代表Eden与Survivor的比为8:1