Java中的4种对象引用类型:强引用、软引用、弱引用和虚引用
2016-05-16 22:05
375 查看
Java中为程序员提供了4个不同级别对象引用类型,按照级别从高到低分别为:强引用(StrongReference)、软引用(SoftReference)、弱引用(WeakReference)和虚引用(PlantomReference)。在这四种引用类型中,只有强引用类型是包内可见的,其他三种的可见性都为public,且在使用时均是显示使用,如SoftReference sf = newSoftReference(Object)。
强引用是我们最常见到的对象引用类型,如String s = new String
()便是一个强引用。强引用的主要特点如下:
1. 可以直接访问目标对象;
2. 所指向的对象在任何时候都不会被回收。JVM宁可抛出OOM(out of memory)异常也不会回收强引用所指向的对象,即GC(垃圾回收器)绝对不会回收强引用类型;
3. 由于GC绝不会回收强引用,所以它将可能导致内存泄漏。
软引用用于实现一些内存敏感的缓存,当系统内存充足时,这部分缓存可用于加速系统的运行,提高系统速度,但当系统内存紧张时,系统便会回收这部分内存,被回收的这些软引用会被加入与它们相关联的引用队列中。
弱引用用于实现一些规范化映射(WeakHashMap),其中key或者value当它们不再被引用时可以自动被回收。当你想引用一个对象,但是这个对象有自己的生命周期,你又不想介入这个对象的生命周期时,便可以用弱引用。同时弱引用也可以用来保存那些可有可无的缓存数据,和软引用一样,在内存充足时加速系统,在内存不足时便被系统回收。弱引用在系统GC时,只要一被发现,不管系统堆内存空间是否足够,都会将对象进行回收,一旦被回收便会加入到一个注册的引用队列中。但是,由于垃圾回收器的线程通常优先级很低,所以并不一定能很快发现持有弱引用的对象。
虚引用主要用来跟踪对象被垃圾回收器回收,清理的活动,提供比Java清理机制更灵活的处理方式。虚引用是所有引用类型中最弱的一个,如果一个对象拥有一个虚引用,那它便和没有被引用一眼,随时可能被GC回收,而且GC在回收时会直接销毁持有该引用的对象,并把虚引用加入引用队列中。除此之外需要注意的一点是,当虚引用试图通过get()方法取得强引用时,无论强引用是否存在,总是会失败,即获得的返回值永远为null。
强引用是我们最常见到的对象引用类型,如String s = new String
()便是一个强引用。强引用的主要特点如下:
1. 可以直接访问目标对象;
2. 所指向的对象在任何时候都不会被回收。JVM宁可抛出OOM(out of memory)异常也不会回收强引用所指向的对象,即GC(垃圾回收器)绝对不会回收强引用类型;
3. 由于GC绝不会回收强引用,所以它将可能导致内存泄漏。
软引用用于实现一些内存敏感的缓存,当系统内存充足时,这部分缓存可用于加速系统的运行,提高系统速度,但当系统内存紧张时,系统便会回收这部分内存,被回收的这些软引用会被加入与它们相关联的引用队列中。
弱引用用于实现一些规范化映射(WeakHashMap),其中key或者value当它们不再被引用时可以自动被回收。当你想引用一个对象,但是这个对象有自己的生命周期,你又不想介入这个对象的生命周期时,便可以用弱引用。同时弱引用也可以用来保存那些可有可无的缓存数据,和软引用一样,在内存充足时加速系统,在内存不足时便被系统回收。弱引用在系统GC时,只要一被发现,不管系统堆内存空间是否足够,都会将对象进行回收,一旦被回收便会加入到一个注册的引用队列中。但是,由于垃圾回收器的线程通常优先级很低,所以并不一定能很快发现持有弱引用的对象。
虚引用主要用来跟踪对象被垃圾回收器回收,清理的活动,提供比Java清理机制更灵活的处理方式。虚引用是所有引用类型中最弱的一个,如果一个对象拥有一个虚引用,那它便和没有被引用一眼,随时可能被GC回收,而且GC在回收时会直接销毁持有该引用的对象,并把虚引用加入引用队列中。除此之外需要注意的一点是,当虚引用试图通过get()方法取得强引用时,无论强引用是否存在,总是会失败,即获得的返回值永远为null。
相关文章推荐
- 修改Eclipse编码格式及JSP页面乱码的处理
- Java集合类的混淆点总结(一)
- Eclipse中ctrl+左键的快捷键无效
- JAVA学习笔记整理一(基础知识)
- SpringMVC注解@RequestParam全面解析---打酱油的日子
- java开发前奏
- Petya and Java
- 【Java】容器集合类
- java学习总结(16.05.16)java的标识符和命名规则
- [javaSE] 数组(获取最值)
- Java再学习-简单回调函数
- java基础第八天
- Java基础-第7天
- eclipse导入JDK源码
- spring 引入命名空间简介
- spring 数据连接泄漏
- spring数据连接泄漏
- Java面向对象之继承
- Java面向对象之多态
- 深入java之java语言基础(一)