Chinaunix首页 | 论坛 | 博客
  • 博客访问: 69196
  • 博文数量: 43
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 420
  • 用 户 组: 普通用户
  • 注册时间: 2014-06-27 15:04
个人简介

记录,分享

文章分类

全部博文(43)

文章存档

2017年(24)

2015年(1)

2014年(18)

我的朋友

分类: Java

2017-03-16 11:21:11

1. 强引用(StrongReference):
JVM 中对象是被分配在堆(heap)上的,当程序行动中不再有引用指向这个对象时,这个对象就可以被垃圾回收器所回收。通常对象赋值表达式得到的是强引用,它有以下特点:
- 强引用可以直接访问目标对象。
- 强引用所指向的对象在任何时候都不会被系统回收。
- 强引用可能导致内存泄漏。
2. 软引用(SoftReference):
SoftReference 在“弱引用”中属于最强的引用。SoftReference 所指向的对象,当没有强引用指向它时,会在内存中停留一段的时间,垃圾回收器会根据 JVM 内存的使用情况(内存的紧缺程度)以及 SoftReference 的 get() 方法的调用情况来决定是否对其进行回收。
软引用有以下特征:
- 软引用使用 get() 方法取得对象的引用从而访问目标对象。
- 软引用所指向的对象按照 JVM 的使用情况(Heap 内存是否临近阈值)来决定是否回收。
- 软引用可以避免 Heap 内存不足所导致的异常。

当垃圾回收器决定对其回收时,会先清空它的 SoftReference,也就是说 SoftReference 的 get() 方法将会返回 null ,然后再调用对象的 finalize() 方法,并在下一轮 GC 中对其真正进行回收。
具体使用一般是通过 SoftReference 的构造方法,将需要用弱引用来指向的对象包装起来。当需要使用的时候,调用 SoftReference 的 get() 方法来获取。当对象未被回收时 SoftReference 的 get() 方法会返回该对象的强引用。如下:
SoftReference bean = new SoftReference(new Bean("name", 10));
System.out.println(bean.get());// “name:10”
3. 弱引用(WeakReference )
WeakReference 是弱于 SoftReference 的引用类型。弱引用的特性基本与软引用相似,区别就在于弱引用所指向的对象只要满足进行系统垃圾回收的条件(没有强引用),不管内存使用情况如何,永远对其进行回收( get() 方法返回 null )。
完全可以通过和 SoftReference 一样的方式来操作 WeakReference,这里就不再复述。

弱引用有以下特征:
- 弱引用使用 get() 方法取得对象的引用从而访问目标对象。
- 一旦系统内存回收,无论内存是否紧张,弱引用指向的对象都会被回收。
- 弱引用也可以避免 Heap 内存不足所导致的异常。

4. 虚引用(PhantomReference)
PhantomReference 是所有“弱引用”中最弱的引用类型。不同于软引用和弱引用,虚引用无法通过 get() 方法来取得目标对象的引用从而使用目标对象,观察源码可以发现 get() 被重写为永远返回 null 。
那虚引用到底有什么作用?其实虚引用主要被用来 跟踪对象被垃圾回收的状态 ,通过查看引用队列中是否包含对象所对应的虚引用来判断它是否 即将 被垃圾回收,从而采取行动。它并不被期待用来取得目标对象的引用,而目标对象被回收前,它的虚引用会被放入一个 ReferenceQueue 对象中,从而达到跟踪对象垃圾回收的作用。

所以具体用法和之前两个有所不同,它必须传入一个 ReferenceQueue 对象。当虚引用所引用对象被垃圾回收后,虚引用会被添加到这个队列中:

public static void main(String[] args) {
ReferenceQueue refQueue = new ReferenceQueue();
PhantomReference referent = new PhantomReference(
new String("T"), refQueue);
System.out.println(referent.get());// null
System.gc();
System.runFinalization();
System.out.println(refQueue.poll() == referent); //true
}

虚引用有以下特征:
- 虚引用永远无法使用 get() 方法取得对象的引用从而访问目标对象。
- 虚引用所指向的对象在被系统内存回收前,虚引用自身会被放入 ReferenceQueue 对象中从而跟踪对象垃圾回收。
- 虚引用不会根据内存情况自动回收目标对象。


阅读(339) | 评论(0) | 转发(0) |
0

上一篇:[python核心编程]笔记

下一篇:JAVA笔记_泛型

给主人留下些什么吧!~~