如何判断一个对象是否可回收,GC回收对象的过程方式,finilized函数

面试问题:

判断一个对象是否可用(存活,可回收),GC回收对象的过程方式,finilized函数了解吗,调用了finilized函数的对象一定会被回收吗,可以主动调用finilized函数吗?

判断一个对象是否可用:

根搜索算法(可达性分析),引用计数法(循环引用,js使用)

JVM使用的根搜索算法(引自深入理解JVM):

一个对象到GC Roots没有任何引用链相连,则该对象不可用,这时Java虚拟机可以对这些对象进行回收。

Java虚拟机将以下对象定义为 GC Roots :

  • Java虚拟机栈中引用的对象,虚拟机栈中(栈帧)
  • 静态属性引用的对象,static对象
  • 常量引用的对象,final对象
  • 本地方法栈中引用的对象,nio

finilized函数是遗留产出,和C++的析构函数有本质区别,调用了finilized函数对象不一定会被回收,finilized函数也不是每次必会被调用。一般回收对象会调用这个函数,但我们不必重写这个函数因为Object中已经实现了一个空的finilized。

protected void finalize() throws Throwable { }

经过根搜索算法的可达性分析某个对象没有和GC Roots的直接或间接联系(不可达),并不意味着该对象将被回收,还需要经过两次标记和筛选工作,才能决定是否可以回收对象。

第一次:判断是否有finalize方法或者执行过finalize,如果没有finalize方法或者已经执行过finalize方法,不需要进行筛选则可以回收,否则需要进行筛选进行第二次标记和筛选。

第二次:执行对象的finalize方法,执行完成或者执行过程中判断对象是否和GC Roots是否有直接或者间接联系,如果依然没有联系则把对象放入回收列表等待回收,否则对象复活。

finilized函数执行的大致过程:

当对象变成(GC Roots)不可达时,GC会判断该对象是否覆盖了finalize方法或者是否执行过了finalize方法,若未覆盖或者已经执行,则直接将其放入回收列表等待回收。

否则,若对象未执行过finalize方法,将其放入F-Queue队列,由一低优先级线程执行该队列中对象的finalize方法,不一定等待finalize方法执行完毕后才进行判断(因为如果等待finalize执行完毕,可能具有一定的延迟,导致F-Queue队列阻塞),则执行finalize方法过程中,GC会再次判断该对象是否可达,若不可达,则进行回收,否则,对象“复活”。

Java中的finalize的调用具有不确定性,就是说何时调用(调用时机)是不确定的,JVM也不保证一定会被调用。

子类可以实现这个方法做一些回收资源的操作。

可以主动调用finilized函数吗?

finalize()可以主动调用, 但不建议调用, 由于gc也会调用可能会发生某种异常导致资源释放出现问题。

java的四种引用类型

上面的分析可知,无论是通过引用计数还是可达性分析的判断都用到了引用,那么引用是否可以被回收就至关重要了,如果一个引用要么可以被回收,要么就不能被回收那对于一些“可回收”的对象就无能无力了,jdk1.2之后扩充了引用的概念,将引用分为强引用(Strong Reference),软引用(Soft Reference),弱引用(Weak Reference),虚引用(Phantom Reference),四种引用引用的强度依次逐渐减弱。

强引用:程序中的普通对象赋值就是强引用,只要引用还在垃圾回收器就永远不会回收被引用的对象。

软引用:描述还有用但并非必须的对象,在系统将要发生内存溢出异常之前,将会把这些对象放入回收范围内进行二次回收,如果还没有足够内存,才抛出异常。

弱引用:也是用来描述非必须对象,强度更弱,弱引用关联的对象只能生存到下一次垃圾收集发生之前,无论内存是否足够都会被回收掉。

虚引用:一个对象是否有虚引用的存在,不会对其生存时间产生任何影响,也无法通过虚引用获取对象实例,虚引用的唯一一个目的就是能在对象被回收时收到一个系统通知。

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值