永发信息网

Java中的几种引用方式

答案:2  悬赏:70  手机版
解决时间 2021-11-25 03:02
Java中的几种引用方式
最佳答案
1)强引用(StrongReference)
  强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。 
 2)软引用(SoftReference)
  如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。
  所以,软引用可用来实现内存敏感的高速缓存。
  软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。
  3)弱引用(WeakReference)
  弱引用与软引用的区别在于:弱引用的对象拥有更短暂的生命周期。
  在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。
  弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。
  4)虚引用(PhantomReference)
  “虚引用”顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。
  如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。
  虚引用主要用来跟踪对象被垃圾回收器回收的活动。
  虚引用与软引用和弱引用的一个区别在于:
  虚引用必须和引用队列(ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。
  程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。
全部回答
Java中有几种不同的引用方式,它们分别是:强引用、软引用、弱引用和虚引用。下面,我们首先详细地了解下这几种引用方式的意义。强引用在此之前我们介绍的内容中所使用的引用都是强引用,这是使用最普遍的引用。如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它。当内存空 间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。软引用(SoftReference)SoftReference 类的一个典型用途就是用于内存敏感的高速缓存。SoftReference 的原理是:在保持对对象的引用时保证在 JVM 报告内存不足情况之前将清除所有的软引用。关键之处在于,垃圾收集器在运行时可能会(也可能不会)释放软可及对象。对象是否被释放取决于垃圾收集器的算法 以及垃圾收集器运行时可用的内存数量。弱引用(WeakReference)WeakReference 类的一个典型用途就是规范化映射(canonicalized mapping)。另外,对于那些生存期相对较长而且重新创建的开销也不高的对象来说,弱引用也比较有用。关键之处在于,垃圾收集器运行时如果碰到了弱可及对象,将释放 WeakReference 引用的对象。然而,请注意,垃圾收集器可能要运行多次才能找到并释放弱可及对象。虚引用(PhantomReference)PhantomReference 类只能用于跟踪对被引用对象即将进行的收集。同样,它还能用于执行 pre-mortem 清除操作。PhantomReference 必须与 ReferenceQueue 类一起使用。需要 ReferenceQueue 是因为它能够充当通知机制。当垃圾收集器确定了某个对象是虚可及对象时,PhantomReference 对象就被放在它的 ReferenceQueue 上。将 PhantomReference 对象放在 ReferenceQueue 上也就是一个通知,表明 PhantomReference 对象引用的对象已经结束,可供收集了。这使您能够刚好在对象占用的内存被回收之前采取行动。Reference与ReferenceQueue的配合使用。GC、Reference与ReferenceQueue的交互A、 GC无法删除存在强引用的对象的内存。B、 GC发现一个只有软引用的对象内存,那么:① SoftReference对象的referent 域被设置为null,从而使该对象不再引用heap对象。② SoftReference引用过的heap对象被声明为finalizable。③ 当heap 对象的 finalize() 方法被运行而且该对象占用的内存被释放,SoftReference 对象就被添加到它的 ReferenceQueue(如果后者存在的话)。C、 GC发现一个只有弱引用的对象内存,那么:① WeakReference对象的referent域被设置为null,从而使该对象不再引用heap对象。② WeakReference引用过的heap对象被声明为finalizable。③ 当heap对象的finalize()方法被运行而且该对象占用的内存被释放时,WeakReference对象就被添加到它的ReferenceQueue(如果后者存在的话)。D、 GC发现一个只有虚引用的对象内存,那么:① PhantomReference引用过的heap对象被声明为finalizable。② PhantomReference在堆对象被释放之前就被添加到它的ReferenceQueue。值得注意的地方有以下几点:1、GC在一般情况下不会发现软引用的内存对象,只有在内存明显不足的时候才会发现并释放软引用对象的内存。2、GC对弱引用的发现和释放也不是立即的,有时需要重复几次GC,才会发现并释放弱引用的内存对象。3、软引用和弱引用在添加到ReferenceQueue的时候,其指向真实内存的引用已经被置为空了,相关的内存也已经被释放掉了。而虚引用在添加到ReferenceQueue的时候,内存还没有释放,仍然可以对其进行访问。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
乳化液、半合成切削液、合成切削液的区别是什
禅宗自然门,不知道现在还有没有谢子安师傅的
笋干丝有种怪味怎么吃
大陆早上7点台湾现在是几点
阿婆家时尚餐厅怎么样
中国现在有载人上月球的能力吗?
中通快递洪湖公司(大同分部)地址有知道的么?
磁盘自动检测发现48个坏扇区,磁盘还能用吗
199×99+99×2递等式计算
顾景舟的关门弟子都有谁....
k216列车北京到图们到朝阳镇几点
补办天然气卡,需带什么证件
我同事脖子两古起来 这怎么回事
今天刚刚好打耳洞两周,今天去转耳洞戴着的耳
有没有学长啊
推荐资讯
院庭院假山鱼池边沿高度
求一份加州旅馆的贝司谱,最好有高清的图,谢
怎样把蜜枣蒸的好吃
变频器维修显示ol1是什么意思
400111086这是中国移动通信投诉电话吗?
家有喜事婚庆(321省道爱的集合旁)地址在哪,
emyeuanh iloveyou. emyeuanh是什么意思
深圳大学成人高考今年还招吗?什么时候可以报
都说佳能柔尼康锐,到底是个什么样的概念啊。
为什么要给“Div”等容器添加Flex属性样式
昆明市嵩明县的杨桥乡大牲畜交易市场,谁有电
用盐水洗鼻的时候,水是用温开水,还是自
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?