Java 垃圾回收基础问题

1、Object的finalize()方法的作用是否于C++的析构函数作用相同?

与C++的析构函数不同,析构函数调用确定,而它的是不确定的

将未被引用的对象放置在F-Queue队列

方法执行随时可能被终止

给予对象最后一次重生的机会

finalize示例

public class Finalization {

    public static Finalization finalization;

    @Override
    protected void finalize() throws Throwable {
        System.out.println("finalized");
        finalization = this;
    }

    public static void main(String[] args) throws InterruptedException {
        Finalization f = new Finalization();
        System.out.println("First print: " + f);
        f = null;
        System.gc();
        //休息一段时间,让上面的垃圾回收线程执行完成
        Thread.sleep(1000);
        System.out.println("Second print:" + f);
        System.out.println(f.finalization);

    }
}

  

  打印结果:

First print: jvm.gc.Finalization@2503dbd3
finalized
Second print:null
jvm.gc.Finalization@2503dbd3

2、Java中的强引用,软引用,弱引用,虚引用有什么用

强引用(Strong Reference)

 最普遍的引用: Object obj = new Object()

 抛出OutOfMemoryError终止程序也不会回收具有强引用的对象

 通过将对象设置为null来弱化引用,使其被回收

软引用(Soft Reference)

对象处在有用但非必须的状态

只有当内存空间不足时,GC会回收该引用的对象的内存

可以用来实现高速缓存

用法如下:

 弱引用(Weak Reference)

非必须的对象,比软引用更弱一些

GC时会被回收

被回收的概率不大,因为GC线程优先级比较低

适用于引用偶尔被使用且不影响垃圾收集的对象

用法如下:

虚引用(Phantom Reference) (顾名思义,弱引用形同虚设)

不会决定对象的生命周期

任何时候都可能被垃圾收集器回收

跟踪对象被垃圾收集器回收的活动,起到哨兵作用

必须和引用队列ReferenceQueue联合使用

用法如下

总结:四种引用级别

强引用 > 弱引用 > 软引用 > 虚引用

类的层次结构

引用队列(ReferenceQueue)

无实际存储结构,存储逻辑依赖于内部节点之间的关系来表达

存储关联的且被GC的软引用,弱引用以及虚引用

原文地址:https://www.cnblogs.com/linlf03/p/12180897.html