请问Java中的引用分为哪几种级别?这几种级别之间都有些什么区别?
答:为了使程序更灵活地控制对象的生命周期,在JDK1.2版本之后,把对象的引用分为4种级别。这4种级别由高到底分别为:强引用(StrongReference)、软引用(SoftReference)、弱引用(WeakReference)、虚引用(PhantomReference)。它们有其各自的特点和使用场合。
1、强引用:这种引用是最普遍的引用,如果一个对象具有强引用,垃圾回收器绝对不会对这样的对象进行回收。尽管在内存严重不足的时候,Java虚拟机宁愿抛出OutOfMemoryError错误,使异常程序异常终止,也不会随便回收具有强引用的对象占用的资源来解决内存不足的问题。
2、软引用:如果一个对象只具有软引用,那么它就像日常生活中那些可有可无的生活用品。如果内存空间不足时,垃圾回收器就会对这样的对象进行回收;相反,如果内存空间还充足时,垃圾回收器不会对具有软引用对象所占用的资源进行回收。软引用可以用来实现内存敏感的高速缓存。
3、弱引用:如果一个对象只具有弱引用,那就类似于可有可无的生活用品。弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。
4、虚引用:“虚引用”顾名思义,就是形同虚设,与其他几种引用都不一样,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用是一样的,在任何时候都可能被垃圾回收器回收。虚引用主要用来跟踪对象被垃圾回收器回收的活动。虚引用与软引用的一个区别在于:虚引用必须和引用队列(ReferenceQueue)联合使用。当垃圾回收器准备一个对象时,如果发现它还有虚引用,就会在回收该对象的内存之前,把这个虚引用加入到与之关联的引用队列中。程序可以通过判断引用对象中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。
此外,在java.lang.ref包中提供了三个类——SoftReference类、WeakReference类和PhantomReference类,它们分别代表软引用、弱引用和虚引用。而ReferenceQueue类表示引用队列,它可以和这三种引用类型联合使用,以便跟踪Java虚拟机回收所引用的对象的活动。使用弱引用的一个例子如下所示:
String str = new String("hello");
ReferenceQueue<String> rq = new ReferenceQueue<String>();
WeakReference<String> wf = new WeakReference<String>(str,rq);
str = null;
String str1 = wf.get(); //如果“hello”对象没有被回收,str1引用“hello”对象
//如果“hello”对象没有被回收,rq.poll()返回null
Reference<? extends String> ref = rq.poll();
分享到:
相关推荐
java 面试java 面试java 面试java 面试java 面试
java面试问题集锦
JAVA面试问题,自己和别人总结JAVA面试问题,自己和别人总结
这份资源是一份包含1000+道Java面试题的整理版,旨在帮助广大Java开发者更好地准备面试,提升面试成功率。内容涵盖了Java的基础知识、高级特性、常见问题等多个方面,每个问题都附带了详细的答案解析,有助于读者...
JAVA面试资料JAVA面试资料 JAVA面试资料 JAVA面试资料 JAVA面试资料 JAVA面试资料 JAVA面试资料 JAVA面试资料 JAVA面试资料 JAVA面试资料 JAVA面试资料 JAVA面试资料 JAVA面试资料 JAVA面试资料 JAVA面试资料 JAVA...
面试题包含了不同技术层面的面试问题,同时也能对一些没有面试开发经验的小白给予不可估量的包装, 让你的薪水绝对翻倍, 本人亲试有效.Java面试题84集、java面试专属及面试必问课程,所有的面试题有视屏讲解, 解答方案....
JAVA面试题JAVA面试题JAVA面试题JAVA面试题JAVA面试题JAVA面试题JAVA面试题JAVA面试题JAVA面试题
java面试题java面试题java面试题java面试题java面试题java面试题java面试题java面试题java面试题java面试题java面试题java面试题java面试题java面试题java面试题java面试题java面试题java面试题java面试题java面试题...
java面试问题小集 收集了一些面试题目
java面试题集合java面试题集合java面试题集合java面试题集合java面试题集合java面试题集合
常见Java面试问题,里面涵盖了基础的Java面试问题,有助于准备面试
java对日外包面试题
java面试题目java面试题目java面试题目java面试题目java面试题目java面试题目
java面试宝典2017版,各种java面试题汇总 java面试宝典2017版,各种java面试题汇总 java面试宝典2017版,各种java面试题汇总
日本公司java面试问题集。非常实用。适用于日企、软件外包、赴日软件开发。(日文)
java面试宝典2018版java面试宝典2018版java面试宝典2018版java面试宝典2018版
Java面试题
java面试问题大全,帮您成功!!!!!!!!!!!!