java内存回收----引用

前面介绍过java内存泄漏问题,这里详细解释一下java内存回收机制。

对于java垃圾回收机制来说,判断一个对象是否可回收的标准在于该对象是否被引用,因此引用也是JVM进行内存管理的一个重要概念。为了更好地管理对象的引用,从JDK1.2开始,java在java.lang.ref包下提供了三个类:SoftReference、PhantomReference和WeakReference,它们分别代表了系统对对象的三种引用方式:软引用、虚引用和弱引用。归纳起来,java语法对对象的引用有如下四种:

  • 强引用
  • 软引用
  • 弱引用
  • 虚引用

强引用

这是java最常见的引用方式,也是大家最熟悉的一个引用,程序创建一个对象,然后赋值给一个引用变量,这个引用就是强引用。
被强引用所引用的java对象绝不会被垃圾回收机制回收,即使内存十分紧张。由于jvm肯定不会回收强引用的对象,因此强引用是造成java内存泄漏的主要原因!

软引用

软引用需要通过SoftReference类来实现,当一个对象只具有软引用时,它有可能被垃圾回收机制回收。对于只有软引用的对象而言,当系统内存空间足够时,她不会被系统回收,程序也可使用该对象;当系统内存空间不足时,系统将会回收它。

软引用通常用于内存敏感的程序,是强引用很好的替代。

弱引用

弱引用和软引用很相似,但是比软引用生命周期更短。弱引用使用WeakReference类来实现。对于只有弱引用的对象而言,当系统垃圾回收机制运行时,不管系统内存是否足够,总会回收该对象所占用的内存。当然不是所当一个对象只有弱引用时,它就立即回收,而是要等到系统垃圾回收机制运行时。

虚引用

软引用和弱引用都可以单独使用,但是虚引用不能单独使用,单独使用虚引用没有太大的意义。虚引用的主要作用就是跟踪对象被垃圾回收的状态,程序可以通过检查与虚引用关联的引用队列中是否已经包含指定的虚引用,从而了解虚引用所引用的对象是否即将被回收。
虚引用通过PhantomReference类实现,它类似与没有引用。虚引用对于对象本身没有太大影响,对象甚至感觉不到虚引用的存在。如果一个对象只有一个虚引用,那么它和没有引用的效果大致相同。虚引用主要用于跟踪对象被垃圾回收的状态。虚引用不能单独使用,虚引用必须和引用队列(ReferenceQueue)联合使用。

你可能感兴趣的:(java内存回收----引用)