java的虚拟机如何判断一个对象是否可被回收呢?

欣喜 Java每日一问 发布时间:2024-07-25 17:23:01 阅读数:9692 1
我们都知道jvm有一个自动垃圾回收机制,那么她是如何判断一个对象需要回收呢?下文笔者将一一道来,如下所示

对象是否需要回收的判断方法

 
引用计数器法:
   为每个对象创建一个引用计数器
     有对象引用时计数器 +1
	  引用被释放时计数 -1
	  当计数器为0时就可以被回收
	   它有一个缺点不能解决循环引用的问题
	   
可达性分析算法:
   当一个对象到GC Roots不可达时
    在下一个垃圾回收周期中尝试回收该对象
	 定义一系列GC ROOT为起点
	   从起点开始向下开始搜索
	    搜索走过的路径称为引用链
		 当一个对象到GC ROOT没有任何引用链相连的话
		  则对象可以判定是可以被回收

可达性分析算法详解

当不能从GC Root寻找一条路径到达该对象时
   将进行第一次标记。

第一次标记后检查对象是否重写了finalize()
   和是否已经被调用了finalize()方法
 若没有重写finalize()方法或已经被调用,则进行回收。

在已经重写finalize()方法且未调用的情况下
  将对象加入一个F-Queue 的队列中,稍后进行第二次检查

在第二次标记之前
  对象如果执行finalize()方法并完成自救
   对象则不会被回收
     否则完成第二次标记,进行回收
	  值得注意的是finalize()方法并不可靠。

虚拟机默认采用的是可达性分析算法

可以作为 GC ROOT 的对象包括:
  栈中引用的对象
  静态变量、常量引用对象
  本地方法栈 native 方法引用的对象
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaProblem/202407/8150.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者