java对象几种引用(reference)的分析(待后期完善)
2011-06-21 09:44
381 查看
java对象的引用reference分为有强引用,软引用,弱引用,虚引用这几种形式。【后期再深入系统的学习并完善】
[b]Soft Reference[/b][b](软引用)[/b]
指到的对象,即使没有任何Direct Reference,也不会清除,一直到jvm内存不足且没有Direct Reference时候才会清除。
应用场景:常用来设计缓存,不但可以将对象缓存起来,也不会容易造成内存不足。
Weak Reference(弱引用)
GC一旦发现了弱引用关系进行就开始收集对象。
应用场景:想查看某些对象信息,又不想影响GC对其的收集工作。
与GC的交互:
1.将referent置为null引用;
2.将堆中的目标对象设置为“finalizable(可结束的)”;
3.先执行finalize(),释放内存,软引用添加到RefernceQueue中。
ReferenceQueue在 soft
renference和 weak reference中可以为null,但虚应用中必须有!
PhantomReference(虚引用)
与GC的交互:
1.不将referent置为null引用;而是将堆中的目标对象设置为“finalizable(可结束的)”;
2.先软引用添加到RefernceQueue中。然后收集对象,释放内存
附注:ReferenceQueue在 soft renference和 weak reference中可以为null,但虚引用中必须有!
[b]抽象类Reference分析[/b]
java.lang.ref包中有四个类,他们的关系是PhantomReference,WeakReference,SoftReference继承了抽象类Reference。Reference类中,有thread子类(ReferenceHandler),并在静态区域中开启,对pending字段进行实时的监控。
pending是由jvm来赋值的,当Reference内部的referent对象的可达状态改变时,jvm会将Reference对象放入pending链表。
一旦relevent=
null,垃圾收集时会标记WeakReference的referent为不可达get()返回null,并且通过
赋值给pending ,触发ReferenceHandler线程处理pending。
ReferenceHandler线程要做的是将pending对象enqueue,但默认我们所提供的queue,也就是从构造函数传入的是null,实际是使用了ReferenceQueue.NULL,Handler线程判断queue为ReferenceQueue.NULL则不进行操作,只有非ReferenceQueue.NULL 的queue才会将Reference进行enqueue。
[b]Soft Reference[/b][b](软引用)[/b]
指到的对象,即使没有任何Direct Reference,也不会清除,一直到jvm内存不足且没有Direct Reference时候才会清除。
应用场景:常用来设计缓存,不但可以将对象缓存起来,也不会容易造成内存不足。
Weak Reference(弱引用)
GC一旦发现了弱引用关系进行就开始收集对象。
应用场景:想查看某些对象信息,又不想影响GC对其的收集工作。
与GC的交互:
1.将referent置为null引用;
2.将堆中的目标对象设置为“finalizable(可结束的)”;
3.先执行finalize(),释放内存,软引用添加到RefernceQueue中。
ReferenceQueue在 soft
renference和 weak reference中可以为null,但虚应用中必须有!
PhantomReference(虚引用)
与GC的交互:
1.不将referent置为null引用;而是将堆中的目标对象设置为“finalizable(可结束的)”;
2.先软引用添加到RefernceQueue中。然后收集对象,释放内存
附注:ReferenceQueue在 soft renference和 weak reference中可以为null,但虚引用中必须有!
[b]抽象类Reference分析[/b]
java.lang.ref包中有四个类,他们的关系是PhantomReference,WeakReference,SoftReference继承了抽象类Reference。Reference类中,有thread子类(ReferenceHandler),并在静态区域中开启,对pending字段进行实时的监控。
pending是由jvm来赋值的,当Reference内部的referent对象的可达状态改变时,jvm会将Reference对象放入pending链表。
一旦relevent=
null,垃圾收集时会标记WeakReference的referent为不可达get()返回null,并且通过
赋值给pending ,触发ReferenceHandler线程处理pending。
ReferenceHandler线程要做的是将pending对象enqueue,但默认我们所提供的queue,也就是从构造函数传入的是null,实际是使用了ReferenceQueue.NULL,Handler线程判断queue为ReferenceQueue.NULL则不进行操作,只有非ReferenceQueue.NULL 的queue才会将Reference进行enqueue。
相关文章推荐
- java对象几种引用(reference)的分析
- java中的几种对象引用(Reference)
- java中的几种对象引用(Reference)
- Java对象的强、软、弱和虚引用原理+结合ReferenceQueue对象构造Java对象的高速缓存器
- 常见Java面试题 – 第一部分:非可变性(Immutability)和对象引用(Object reference)
- Java中,父类引用指向子类对象的问题分析
- Java内存泄露分析,Java弱引用(weakreference)
- java中对“对象”(object)以及“对象引用”(reference)的理解
- java内存泄露分析,java弱引用(weakreference)
- 【转】常见Java面试题 – 第一部分:非可变性(Immutability)和对象引用(Object reference)
- Java引用对象SoftReference WeakReference PhantomReference
- 常见Java面试题 – 第一部分:非可变性(Immutability)和对象引用(Object reference)
- Java引用对象SoftReference WeakReference PhantomReference
- Java对象的强、软、弱和虚引用原理+结合ReferenceQueue对象构造Java对象的高速缓存器
- SoftReference java 对象的强、软、弱和虚引用
- Java引用对象SoftReference WeakReference PhantomReference
- 判断Java中对象存活的算法以及Java中存在的几种引用
- Java对象的强、软、弱和虚引用原理+结合ReferenceQueue对象构造Java对象的高速缓存器
- Java和ABAP中的几种引用类型的分析和比较
- Java中方法调用参数传递的方式是传值,尽管传的是引用的值而不是对象的值。(Does Java pass by reference or pass by value?)