一、概述
运行时数据区中,程序计数器、虚拟机栈、本地方法栈都是随线程而生随线程而灭的
因此,他们的内存分配和回收是确定的,在方法或线程结束时就回收。而Java堆和方
法区则是不确定的,程序运行过程中创建对象的大小是不定的,只有在程序处于运行
期才能知道所需内存的大小
二、“存活算法”
要判断对象是否存活,主要有两种算法:引用计数法和可达性分析算法
引用计数法
引用计数法就是给对象加上一个引用计数器,每当对象被 引用一次
计数器值就加1,引用时效则减1,计数器为0则表示不会再被使用。
可达性分析算法
可达性分析算法是主流的实现,这个算法通过成为GC ROOT的节点作为根节点,
从此根节点向下搜索,若对象到GC ROOT没有引用链相连(即不可达)时,表示该
对象不可用
可作为GC ROOT的对象为:
虚拟机栈中本地变量表里的引用对象
方法去中的类静态属性引用独享
方法去中的敞亮对象
本地方法中的引用对象
目前可达性分析算法已是主流算法,原因是,引用计数器算法无法解决对象互相引用的问题
可达性分析判断过程
对对象进行可达性分析之后,发现他没有任何引用链相连,则对他进行第一次标记,并进行一次筛选,
筛选条件是是否需要执行finalize()方法,当对象没有覆盖finalize方法或已经finalize方法已经被调用过,
则认为没有必要执行,如果判断为有必要执行,则会将他放入一个叫做F-Queue的队列中,稍后JVM
会自动建立一个低优先级的finalizer线程去执行这些对象的finalize方法,之后GC会对F-QUEUE中的对
象进行第二次标记,如果此时对象扔没逃脱,则将被回收。
finalize()方法
上面多次提到finalize方法,要注意,对象的finalize方法只会被系统自动调用一次。
不建议大家使用这个方法,他的功能完成可以用try-finally替代
以上是JVM高级特性-三、垃圾收集之判断对象存活算法的详细内容。更多信息请关注PHP中文网其他相关文章!