Object中的finalize()方法的作用是否与C++的析构函数作用相同
- 它与C++的析构函数不同,析构函数调用时机是确定的,即
对象离开作用域后就会被delete掉
,而finalize()方法调用时机是不确定的. - 当垃圾回收器要宣告一个对象死亡时,要经过
至少两次标记过程
,如果对象在经过可达性算法分析后发现其没有与GC Roots相连的引用链
,它就会第一次被标记,并且判断是否执行finalize()方法,如果该对象没有重写finalize()方法或者finalize()方法已经被虚拟机调用过了,那么它就会直接被回收,否则(即重写了finalize()方法且虚拟机为调用过该方法,gc就是调用finalize方法
)它会将未被引用的对象放到一个F-Queue队列中,稍后会由一个虚拟机自动创建的低优先级的Finalizer线程
去触发finalize方法. - 由于Finalizer的优先级比较低,触发该方法后,它**不会等这个方法运行结束.**所以方法执行后随时可能会被终止.
- finalize()方法的作用就是给对象创造最后一次重生的机会,只要在finalize方法执行结束前
让对象和一个存活对象的引用链中的任意一个对象相连
,如图中的finalization=this
就是让对象获取重生.
java中强引用,软引用,弱引用,虚引用有什么用
强引用:
- 它是最普遍的引用: 例如
Object obj = new Object();
其中的obj就属于强引用. - 如果一个对象有强引用,当内存内存空间不足的时候,虚拟机宁可抛出OutOfMemoryError异常终止程序,也不会回收有强引用的对象的内存.
- 如果我们不使用该有强引用的对象了,就需要通过
将对象设置为null
来弱化引用或者等待该对象超过其生命周期范围
,使其被回收.
软引用:
- 软引用表示一个对象处在有用但非必须的状态.
- 如果一个对象具有软引用,只有当内存空间不足时,GC才会回收该引用的对象的内存.
- 软引用可以用来实现高速缓存.
- 其用法如图:
弱引用:
- 弱引用指向的对象是
非必须的对象
,强度比软引用更弱一些. - 弱引用对象在GC时就会被回收(不论当前内存是否充足).
- 被回收的概率也不大,因为GC线程优先级比较低,所以有可能找不到哈哈哈.
- 适合于偶尔使用且不影响垃圾收集的对象.
- 用法如图:
虚引用:
- 顾名思义,它就是形同虚设的引用,它
不会决定对象的生命周期
. - 如果一个对象只有虚引用,那它跟没有引用一样一样的,在任何时候都可能被垃圾回收器回收.
- 虚引用主要用来跟踪对象被垃圾回收器回收的活动,起哨兵作用.
- 必须和引用队列ReferenceQueue联合使用.
- 用法如图:
软引用和弱引用也可以通过上述方式进行调用,GC在回收一个对象时,如果发现该对象具有虚引用
,那么在回收前会首先将虚引用加入到与之关联的引用队列当中,程序可以通过判断引用队列是否已经加入虚引用来了解被引用的对象是否被GC回收,也就是起到了一个哨兵的作用.
引用队列:
- 引用队列没有实际的存储结构,存储逻辑依赖于内部节点之间的关系来表达,可以理解为一个链表的结构,只是它会自带一个head头结点,其余的节点(
也就是引用本身
)通过next连接. - 存储关联的且被GC的软引用,弱引用以及虚引用.
引用总结:
其级别由高到低:
强引用>软引用>弱引用>虚引用
引用相关的类层次结构: