Java虚拟机学习 - 对象引用强度
2015-02-11 12:01
274 查看
无论是通过计数算法判断对象的引用数量,还是通过根搜索算法判断对象引用链是否可达,判定对象是否存活都与“引用”相关。
引用主要分为 :强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(PhantomReference) 四种,引用的强度依次骤减。
通过SoftReference类来实现软引用,SoftReference很适合用于实现缓存。另,当GC认为扫描的SoftReference不经常使用时,可会进行回收。
使用方法:
[java]
view plaincopyprint?
User user = new User();
SoftReference<Object> softReference = new SoftReference<Object>(user);
softReference.get();
当获取时,可通过weakReference.get方法获取,可能返回null
可传入一个ReferenceQueue对象到WeakReference构造,当引用对象被表示为可回收时,isEnqueued返回true
[java]
view plaincopyprint?
User user = new User();
WeakReference<User> weakReference = new WeakReference<User>(user);
weakReference.get();
ReferenceQueue<User> referenceQueue = new ReferenceQueue<User>();
WeakReference<User> weakReference2 = new WeakReference<User>(user, referenceQueue);
//当引用对象被标识为可回收时 返回true, 即当user对象标识为可回收时,返回true
weakReference.isEnqueued();
值得注意的是:phantomReference.get方法永远返回null, 当user从内存中删除时,调用isEnqueued会返回true
[java]
view plaincopyprint?
User user = new User();
ReferenceQueue<User> referenceQueue = new ReferenceQueue<User>();
PhantomReference<User> phantomReference = new PhantomReference<User>(user, referenceQueue);
//即当user对象标识为可回收时,返回true
System.out.println(phantomReference.isEnqueued());
//永远返回null
System.out.println(phantomReference.get());
view plaincopyprint?
WeakCache weakCache = new WeakCache();
SoftCache softCache = new SoftCache();
WeakHashMap weakHashMap = new WeakHashMap();
当垃圾回收机制运行,扫描引用关系,GC会对这三种类型的引用进行不同的处理,简单来说,GC首先会判断所扫描到的引用是否为Reference类型,如果为Reference类型,且其所引用的对象无强引用,则认为该对象为相应的Reference类型,之后GC在垃圾回收时这些对象则根据Reference类型的不同进行相应处理。
本文原文链接:/article/1354885.html 转载请注明出处!
引用主要分为 :强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(PhantomReference) 四种,引用的强度依次骤减。
强引用:
就是指在代码之中普遍存在的,类似:“Object objectRef = new Obejct”,这种引用,只要强引用还存在,永远不会被GC清理。软引用:
用来描述一些还有用,但并非必须存在的对象,当Jvm内存不足时(内存溢出之前)会被回收,如果执行GC后,还是没有足够的空间,才会抛出内存溢出异常。通过SoftReference类来实现软引用,SoftReference很适合用于实现缓存。另,当GC认为扫描的SoftReference不经常使用时,可会进行回收。
使用方法:
[java]
view plaincopyprint?
User user = new User();
SoftReference<Object> softReference = new SoftReference<Object>(user);
softReference.get();
弱引用
弱引用也是用来描述一些还有用,但并非必须存在的对象,它的强度会被软引用弱些,被弱引用关联的对象,只能生存到下一次GC前,当GC工作时,无论内存是否足够,都会回收掉弱引用关联的对象。JDK通过WeakReference类来实现。当获取时,可通过weakReference.get方法获取,可能返回null
可传入一个ReferenceQueue对象到WeakReference构造,当引用对象被表示为可回收时,isEnqueued返回true
[java]
view plaincopyprint?
User user = new User();
WeakReference<User> weakReference = new WeakReference<User>(user);
weakReference.get();
ReferenceQueue<User> referenceQueue = new ReferenceQueue<User>();
WeakReference<User> weakReference2 = new WeakReference<User>(user, referenceQueue);
//当引用对象被标识为可回收时 返回true, 即当user对象标识为可回收时,返回true
weakReference.isEnqueued();
虚引用
虚引用称为“幻影引用”,它是最弱的一种引用关系,一个对象是否有虚引用的存在,完全不会对生存时间构成影响。为一个对象设置虚引用关联的唯一目的就是希望能在这个对象被GC回收时收到一个系统通知。通过PhantomReference类实现。值得注意的是:phantomReference.get方法永远返回null, 当user从内存中删除时,调用isEnqueued会返回true
[java]
view plaincopyprint?
User user = new User();
ReferenceQueue<User> referenceQueue = new ReferenceQueue<User>();
PhantomReference<User> phantomReference = new PhantomReference<User>(user, referenceQueue);
//即当user对象标识为可回收时,返回true
System.out.println(phantomReference.isEnqueued());
//永远返回null
System.out.println(phantomReference.get());
其他相关类:
[java]view plaincopyprint?
WeakCache weakCache = new WeakCache();
SoftCache softCache = new SoftCache();
WeakHashMap weakHashMap = new WeakHashMap();
当垃圾回收机制运行,扫描引用关系,GC会对这三种类型的引用进行不同的处理,简单来说,GC首先会判断所扫描到的引用是否为Reference类型,如果为Reference类型,且其所引用的对象无强引用,则认为该对象为相应的Reference类型,之后GC在垃圾回收时这些对象则根据Reference类型的不同进行相应处理。
本文原文链接:/article/1354885.html 转载请注明出处!
相关文章推荐
- Java虚拟机学习 - 对象引用强度
- Java虚拟机学习 - 对象引用强度 ( 8 )
- Java虚拟机学习 - 对象引用强度
- Java虚拟机学习 - 对象引用强度
- Java虚拟机学习(9):对象引用强度
- Java虚拟机学习 - 对象引用强度
- Java虚拟机学习 - 对象引用强度
- Java虚拟机学习 - 对象引用强度
- Java虚拟机学习 - 对象引用强度
- Java虚拟机学习 - 对象引用强度
- Java虚拟机 - 对象引用强度
- Json.Net学习笔记(十) 保持对象引用
- Java学习笔记---6.面向对象编程01-类对象的构建及对象的引用传递
- Java虚拟机学习 - 对象访问
- Java虚拟机学习 - 对象访问
- 18天Java学习---6.面向对象编程01-类对象的构建及对象的引用传递
- [Java学习笔记] 对象的比较(引用比较、值比较) ^_^个人的理解,请多多关照^_^
- 黑马程序员学习日记(3)-对象的引用与构造函数
- 学习android JNI的那些事儿--------6. 在java中传入引用数据类型(对象)作为参数
- Silverlight学习笔记[1] - unhandled error in silverlight application 未将对象引用设置