您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

JVM高级特性-三、垃圾收集之判断对象存活算法

2024/3/16 16:28:08发布16次查看
一、概述
运行时数据区中,程序计数器、虚拟机栈、本地方法栈都是随线程而生随线程而灭的
因此,他们的内存分配和回收是确定的,在方法或线程结束时就回收。而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高级特性-三、垃圾收集之判断对象存活算法的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product