使用最普遍的引用,也是我们日常使用的大多数引用。若一个对象具有强引用,就 相当于生活中必备的物品,垃圾回收器绝对不会回收它,当内存空间不足时,JVM 宁愿抛出 OOM 错误,也不回随意回收具有强引用的对象来解决内存不足问题。
若一个对象只具有软引用,则 相当于生活中可有可无的物品。若内存空间充足,则垃圾回收器不会回收它,一旦内存空间不足,则会回收这些对象的内存。只要垃圾回收器未回收这个对象的内存,则该对象能够被程序使用,通过使用软引用可以实现内存敏感的告诉缓存,加速 JVM 对垃圾内存的回收速度,同时维护系统的运行安全,防止 OOM 等问题的产生。
一若个对象只具有弱引用,则 相当于生活中可有可无的物品。 软引用和弱引用的区别在于:只拥有弱引用的对象具有更短暂的生命周期,在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现具有弱引用的对象,则无论当前内存空间是否充足,都会回收它的内存。 但一般垃圾回收器的线程优先级很低,因此不会很快就回收具有弱引用的对象。
此外 软引用和弱引用都可以和一个引用队列联合使用,一旦他们所引用的对象被垃圾回收,JVM 就会将这个引用加入到相关的引用队列中。
形同虚设的一个引用,不会决定对象的声明周期,一个对象持有虚引用,则任何时候都可能被垃圾回收器回收,主要用来跟踪对象被垃圾回收的活动。
虚引用与软引用和弱引用的区别:虚引用必须和引用对象联合使用。当来及回收器准备回收一个对象时,若发现该对象具有弱引用,则会在回收该对象的内存前,将该虚引用加入到与之关联的引用队列中。程序能够通过判断引用队列中是否已经加入虚引用,来了解被引用的对象是否将要被垃圾回收器回收。
`
强引用(Strong Reference)是我们最常见的普通对象引用,只要还有强引用指向一个对象,就代表这个对象活着,那么这个对象就不会被垃圾收集器回收。如果没有其他的引用,只要超过了引用的作用域或显示的将(强)引用赋为null,就是可以被垃圾回收的了。
软引用(Soft Reference)是一种相对强引用弱化一些的引用,可以让对象豁免一些垃圾回收,只有当JVM认为内存不足时,才会去试图回收软引用指向的对象。JVM会确保在抛出OutOfMemoryError之前,清理软引用指向的对象。软引用通常来实现内存敏感的缓存,如果还有空闲内存,就可以暂时保留缓存,当内存不足时清理掉,这样就保证了使用缓存的同时,不会耗尽内存。
弱引用(Weak Reference)并不能使对象豁免垃圾收集,仅仅是提供一种访问在弱引用状态下对象的途径。这就可以用来构建一种没有特定约束的关系。比如,维护一种非强制性的映射关系,如果试图获取时对象还在,就使用它,否则重现实例化。它同样是很多缓存实现的选择。
幻像引用(虚引用),你不能通过它访问对象。虚引用仅仅是提供了一种确保对象被finalize以后,做某些事情的机制,例如,通常用来做所谓的post-mortem清理机制。