java|java GC常见面试题

Object的finalize()方法的作用是否与C++的析构函数作用相同

  1. 与C++的析构函数不同,析构函数调用确定,而它的是不确定的
  2. 将未被引用的对象放置于F-Queue队列;当垃圾回收器宣布一个对象死亡,至少需要经过两个阶段,1.当对象进行可达性分析时发现没有和GC ROOTS相连接就会被第一次标记;2.判断对象是否覆盖finalize(),如果覆盖,并且未被引用过这个方法的对象就会被放在F-Queue中,最后由JVM执行该方法。
  3. 方法执行随时可能会被终止
  4. 给予对象最后一次重生的机会
【java|java GC常见面试题】finalize()的作用是为对象创造最后一次逃脱死亡的机会。当垃圾回收器宣告一个对象死亡时,至少要经过两次的标记过程,如果对象在进行可达性分析后,发现对象该没有和GC Roots相连接的引用链,就会被第一次标记,并且判断是否执行finalize()方法,如果对象覆盖finalize()方法且未被引用过,这个对象就会被放置在F-Queue队列中,并在稍后由一个虚拟机自动建立的低优先级的final线程去执行触发finalize()方法,触发该方法后不承诺等待其运行结束,即方法执行随时可能会被终止。
java中的强引用、软引用、弱引用、虚引用
强引用(Strong Reference)
  1. 最普遍的引用:Object obj = new Object();
  2. 抛出OutOfMemoryError 终止程序也不会回收具有强引用的对象;
  3. 通过将对象设置为null来弱化引用,让它被回收
软引用(soft reference)SoftReference
  1. 对象处在有用但非必须的状态
  2. 只有当内存空间不足时,GC会回收该引用的对象的内存
  3. 可实现高速缓存
    eg:
    String str = new String(“abc”);
    SoftReference softRef = new SoftReference(Str); //软引用
弱引用WeakReference
  1. 非必须对象,比软引用更弱一些
  2. GC时会被回收
  3. 被回收的概率也不大,因为GC线程优先级较低
  4. 适用于引用偶尔被使用且不影响垃圾收集的对象
    eg:
    String str = new String(“abc”);
    WeakReference weakRefer = new WeakReference(str);
虚引用PhantomReference
  1. 不会决定对象的生命周期
  2. 任何时候都可能被垃圾收集器回收
  3. 跟踪对象被垃圾收集器回收的活动,起哨兵作用
  4. 必须和引用队列ReferenceQueue联合使用
    eg:
    ReferenceQueue queue = new ReferenceQueue();
    PhantomReference ref = new PhantoReference(“abc”,queue);
java|java GC常见面试题
文章图片

java|java GC常见面试题
文章图片

java|java GC常见面试题
文章图片

    推荐阅读