GC相关的面试题

本文深入解析Java中的四种引用类型:强引用、软引用、弱引用和虚引用的区别及应用场景。探讨了它们如何影响对象的生命周期,并解释了finaliz()方法与C++析构函数的不同之处。

问题:Object的finaliz()方法 的作用是否与C++的析构函数作用相同?

---》不同的

1、C++的析构函数调用确定,就是对象离开作用域之后就马上被删除。而java Object的finaliz()调用之后,具有不确定性。

2、将未被引用的对象放置于F-Queue队列(当垃圾回收器要宣告一个对象要死亡的时候,至少要经过2次标记过程,如果对象经过了可达性分析算法之后,发现没有跟GC ROOT有相连的引用链,就被会第一次标记,并判断是否执行finaliz方法,如果 对象覆盖了finaliz方法,且未被引用过,那这个对象就会被放置在F-Queue队列中,并在等一段时间后由虚拟机自动建立的低优先级的finaliz线程去执行这个finaliz方法)

3、方法执行随时可能会被终止

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

public class Finalization {
    public static Finalization finalization;
    @Override
    protected void finalize(){
        System.out.println("Finalized");
        finalization = this;  // 这里是将f之前引用的对象赋值给finalization
    }

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

  

不建议使用finalize方法,因为gc回收之前会调用finalize方法,而gc回收时间是不确定的,导致finalize方法的调用时间不确定。

 

 

问题:Java中额强引用,软引用,弱引用,虚引用,有什么用?(注意着是引用,不是对象)

----》

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

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

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

    问什么时候会回收这个强引用呢?---》1、程序停止了,2、设置为null,3、他的对象超出了生命周期的范围

软引用:对象处于有用但是非必须的状态

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

    可以用来实现高速缓存

    String str = new String("avc"); // 强引用
    SoftReference<String> softRef = new SoftReference<String>(str); // 软引用

 

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

    GC时会被回收,无论当前内存是否足够,一看到弱引用的对象,就马上回收

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

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

String str = new String("abc");
WeekReference<String> abcWeekRef = new WeakReference<>();

 

虚引用:不会决定对象的生命周期

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

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

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

    问:虚引用和弱引用有什么区别?---》虚引用一定和ReferenceQueue配合使用

String str = new Strin("abc");
ReferenceQueue queue = new ReferenceQueue();
PhantomReference ref = new PhantomReference(Str , queue);

 Gc在回收对象,如果发现对象有虚引用,那么在回收之前,则将对象的虚引用放入到与之关联的引用队列中,那么我们可以判断引用队列中是否加入了元素,则知道虚引用是否将要被回收,起到了一个哨兵的作用。

 

 

引用队列

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

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

核心:当对象的引用是软引用,弱引用,虚引用的时候,当引用对象指向的对象被回收之后,引用对象会被加入到ReferenceQueue中!!!作者用了一整个篇幅来说明这个问题!

 

转载于:https://www.cnblogs.com/vingLiu/p/10661521.html

以下是几个 JVM 垃圾回收相关面试题及其答案: 1. 什么是垃圾回收? 垃圾回收是指在程序运行过程中,自动回收不再使用的内存空间,以提高内存利用率和程序的性能。 2. JVM 的垃圾回收机制是什么? JVM 的垃圾回收机制采用分代收集算法,将内存分为新生代和老年代,分别采用不同的垃圾回收算法来回收内存。 3. 新生代垃圾回收器有哪些? 新生代垃圾回收器主要有 Serial、ParNew、Parallel Scavenge 等。 4. 老年代垃圾回收器有哪些? 老年代垃圾回收器主要有 Serial Old、Parallel Old、CMS、G1 等。 5. 什么是对象的引用计数算法? 引用计数算法是一种简单的垃圾回收算法,它通过记录每个对象被引用的次数,当引用次数为 0 时,即可将该对象回收。 6. 引用计数算法的缺点是什么? 引用计数算法的缺点是无法处理循环引用的情况,如果两个对象之间相互引用,它们的引用计数会一直不为 0,导致无法回收。 7. 什么是标记-清除算法? 标记-清除算法是一种常见的垃圾回收算法,它将垃圾回收分为两个阶段:标记阶段和清除阶段。在标记阶段,标记所有活跃对象,将其打上标记;在清除阶段,清除所有未标记的对象。 8. 标记-清除算法的缺点是什么? 标记-清除算法的缺点是会产生大量的内存碎片,会导致内存利用率降低。 以上是一些常见的 JVM 垃圾回收面试题及其答案,希望能对你有所帮助。在面试过程中,需要根据具体的问题进行回答,同时也需要对垃圾回收机制和算法有清晰的认识,才能更好地回答相关的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值