java垃圾回收

来源:互联网 发布:五轴编程工资多少钱 编辑:程序博客网 时间:2024/05/02 00:30

java的垃圾回收是自动的,由虚拟机实现控制,开发者无法控制回收时机,即使调用了system.gc()也只是建议执行,至于是否真的执行,要看虚拟机实现。回收时会调用Object的finalize方法。

Java 中一共有 4 种类型的引用 : StrongReference、 SoftReference、 WeakReference 以及 PhantomReference 



1.StrongReference 是 Java 的默认引用实现, 它会尽可能长时间的存活于 JVM 内, 当没有任何对象指向它时 GC 执行后将会被回收



Object o=new Object();

Object ref=o;
o=null;

此时,如果gc了,那么,ref仍然不为null,即Object不会被回收,类似于linux fs中的硬链接。



2.WeakReference, 顾名思义, 是一个弱引用, 当所引用的对象在 JVM 内不再有强引用时, GC 后 weak reference 将会被自动回收。

如:

Object o=new Object();

WeakReference<Object> ref = new WeakReference<Object>(referent); 

o=null;

此时,如果gc了,那么ref.get()返回null,类似于linux fs中的软链接,或者window中的快捷方式。



此时顺便说一java中的WeakHashMap,WeakHashMap 使用 WeakReference 作为 key, 一旦没有指向 key 的强引用, WeakHashMap 在 GC 后将自动删除相关的 entry

如:

Map<Object, Object> map = new WeakHashMap<Object, Object>();

Object key = new Object();

Object value = new Object();

map.put(key, value);



key = null;

System.gc();



Thread.sleep(0, 1);// 等待无效 entries 进入 ReferenceQueue 以便下一次调用 getTable 时被清理

此时调用map.containsValue(value)即为null。



3.SoftReference 于 WeakReference 的特性基本一致, 最大的区别在于 SoftReference 会尽可能长的保留引用直到 JVM 内存不足时才会被回收,而不是运行gc即被回收,这一特性使得 SoftReference 非常适合缓存应用。

4.PhantomReference,幽灵引用,它的 get() 方法永远返回 null, 这也正是它名字的由来,效果类似于Object o=new Object();o=null;

他只有一个构造函数,第二个参数有一个ReferenceQueue,如果引用对象被回收,那么这个引用会被放进这个queue里边。PhantomReference 唯一的用处就是跟踪 referent 何时被 enqueue 到 ReferenceQueue 中.用来做一些清理工作。



5.此处简单介绍一下ReferenceQueue,对于weakref,softref和phantomref都可以加这个参数,如果引用对象被回收,那么这个引用会被放进这个queue里边,

如:

Object obj = new Object();

ReferenceQueue<Object> refq = new ReferenceQueue<Object>();

WeakReference<Object> ref = new WeakReference<Object>(obj, refq);



System.out.println(ref.isEnqueued());

Reference<? extends Object> polled = refq.poll();

debug(polled);//没有回收,queue没有轮询返回false



obj = null;

System.gc();



debug(ref.isEnqueued());//被回收,ref被放进queue,返回true

debug(refq.poll());//同时,qeue被轮询,并从队列删除。

Reference<? extends Object> removed = refq.remove();//此时,因为ref已经被删除,因此,remove阻塞

本文引自:http://www.caravelsoft.com/forum/forum-1/forum-4/topic-1/

原创粉丝点击