您的位置:首页 > 编程语言 > Java开发

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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: