Java 垃圾回收

Posted work hard work smart

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的软引用,弱引用以及虚引用

 

以上是关于Java 垃圾回收的主要内容,如果未能解决你的问题,请参考以下文章

java中垃圾回收机制的原理

Java垃圾回收怎么理解?

Java开发中垃圾回收的最佳做法?

Java内存与垃圾回收篇(对象内存与垃圾回收机制)上篇

java中是怎样进行垃圾回收的?

java中的垃圾回收机制是怎么回事?