可达性分析算法
来判断对象是否存活。这个算法的基本思路是通多一系列的称为“gc roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到gc roots没有任何引用链项连时(图论来说,从gc到这个对象不可达),则证明此对象是不可用的。
JAVA语言中,可作为gc roots的对象包括下面几种:
强引用 软引用softReference 弱引用weakReference 虚引用phantomReference 强度依次减弱
任何一个对象的finalize()方法都只会被系统自动调用一次,如果对象面临下一次回收,他的finalize()方法不会被再次执行。
长期存活的对象将进入老年代,对象在survivor区中每熬过一次minor gc,年龄就增加一岁。年龄增加到一定程度,默认15岁,就将会被晋升到老年代中。进入老年代的阈值可通过-XX:MaxTenuringThreshold设置。
在发生minor gc之前,虚拟机1会先检查老年代最大可用的连续空间是否大于新生代的所有对象总空间,如果成立,那么minor gc可以确保是安全的。如果不成立,虚拟机会查看handlepromotionfailure设置值是否允许担保失败,如果允许,那么会继续检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均水大小,如果大于,将会尝试进行一次minor gc,尽管这次minor gc是有风险的;如果小于,或者handlepromotionfailure设置不允许冒险,那这时也要改为进行一次full gc。
原文地址:http://blog.csdn.net/jijiaxin1989/article/details/43611525