java中的引用类型
对象引用的强度比较:
强引用(Strong Reference)> 软引用(Soft Reference)> 弱引用(Weak Reference)> 虚引用(Phantom Reference)
- Strong Reference :所谓强引用,就是我们最常见的普通对象引用,只要还有一个强引用指向对象,就表名对象还活着,立即回收器就不会去染指。对于一个普通对象,如果没有其它引用关系,只要超过了引用的作用域或者显式的将相应的强引用赋值为null,就可以被垃圾回收器进行回收了,当然具体还是要看垃圾收集策略。注意:只要强引用还存在,jvm宁愿抛出OutOfMemoryError 也不会去进行回收。
- Soft Reference :软引用就是相对强引用弱化一点的引用,只有当jvm认为内存不足时,才会试图去回收软引用指向的对象,jvm会在确保抛出OutOfMemoryError 之前清理软引用对象。软引用通常用来实现内存敏感的缓存,如果还有空闲内存,就可以暂时保留缓存,让程序更有效率的运行,当内存不足时就清理掉,这就在保证了使用缓存的同时不会因为缓存而耗尽内存。
- Weak Reference : 弱引用仅仅是提供一种访问在弱引用的状态下对象的途径。这就可以用来构建一种没有特定约束的关系,比如维护一种非强制性的映射关系,如果试图获取时该对象还存在,就使用它,否则就重新实例化。弱引用同样也是很多缓存实现的选择。注意:一个对象只有弱引用指向它的时候,它是可以被回收的。
- Phantom Reference :虚引用也可被叫做幻像引用,就像形同虚设一样。你不能通过它访问对象。它仅仅是提供一种确保对象被finalize以后要做某些事情的机制。比如,通常用来做所谓的Post-Mortem清理机制,可以利用虚引用监控对象的创建和销毁。注意:虚引用必须和引用队列(ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。
四种引用状态的比较:
引用类型 | 被垃圾回收时间 | 用途 | 生存时间 |
---|---|---|---|
强引用 | 从来不会 | 对象的一般状态 | JVM停止运行时终止 |
软引用 | 当内存不足时 | 对象缓存 | 内存不足时终止 |
弱引用 | 正常垃圾回收时 | 对象缓存 | 垃圾回收后终止 |
虚引用 | 正常垃圾回收时 | 跟踪对象的垃圾回收 | 垃圾回收后终止 |