问:Object的finalize()方法的作用是否与C++的析构函数作用相同?
- 与C++的析构函数不同,析构函数调用是确定的,而finalize是不确定的
- 将未被引用的对象放置于F-Queue队列(垃圾收集器确定一个对象死亡时需要至少两次标记过程。第一次是可达性分析,没有引用则会标记并且判断是否执行finalize方法,如果对象覆盖了finalize方法且未被引用过就会放置再F-Queue队列中,稍后会由一个虚拟机自动建立的低优先finalize线程触发finalize方法)
- 方法执行随时可能会被终止(因为finalize线程优先级比较低)
- 给予对象最后一次重生的机会
例子:
加入sleep让GC执行完
虽然给予对象最后一次重生的机会,但是运行的不确定性较大,所以不建议使用finalize方法
问:java中强引用、软引用、弱引用、虚引用有什么用?
强引用(Strong Reference)
- 最普遍的引用:Object obj = new Object()
- 抛出OutOfMemoryError终止程序也不会回收具有强引用的对象
- 通过将对象设置为null来弱化引用(或者等待超出对象的生命周期范围),将其回收
软引用(Soft Reference)
- 对象处在有用但非必须的状态
- 只有当内存空间不足时,GC会回收该引用的对象内存
- 可以用来实现高速缓存
弱引用(Weak Reference)
- 非必须的对象,比软引用更弱一些
- GC时会被回收
- 被回收的概率也不大,因为GC线程优先级比较低
- 适用于引用偶尔被使用且不影响垃圾收集的对象
虚引用(PhantomReference)
- 不会决定对象的生命周期
- 任何时候都可能被垃圾收集器回收
- 跟踪对象被垃圾收集器回收的活动,起哨兵作用
- 必须和引用队列ReferenceQueue联合使用
强引用>软引用>弱引用>虚引用
引用队列(ReferenceQueue)
- 无实际存储结构,存储逻辑依赖于内部节点之间的关系来表达,是链表实现的串联起来的
- 存储关联的且被GC的软引用,弱引用以及虚引用
这块只当了解,实际应用较少