强引用(StrongReference):
强引用最常见, StringBuffer buffer=new StringBuffer();这条语句创建了一个stringBuffer类的对象,并用一个变量buffer存储对这个对象的引用,这就是一个强引用。变量持有的是这个对象的引用。通常,引用是一个对象的存储地址,如果一个对象具有强引用,GC绝不回收,哪怕内存不足,JVM抛出outofmemoryError使程序终止,也不会回收StrongReference。
JAVA不像c或者c++一样,java没有取地址符号,也米有解引用符号*或者-->,引用不同于指针,引用不能与整型进行相互转换,也不能进行增减操作。强引用是垃圾回收机制相关的。一般的,如果一个对象可以通过一些列的强引用引用到,那么就说明,它是不会被垃圾回收机制回收的。因为GC不会收回你正在使用的对象,如果一个对象,没有引用指向他,那么它就被认为是一个垃圾。
弱引用(WeakReference):
简单的说就是将对象留在内存的能力不是那么强的引用,不保证不被GC回收的对象,生命周期短,GC一旦发现只有弱引用的对象,就回收它的内存,但GC线程优先级比较低,不会很快发现只有弱引用的对象。
弱引用可以实现WeakHashMap类,和HashMap几乎一样,唯一的区别就是WeakHashMap的键使用WeakReference引用。当WeakHashMap的键被标记为垃圾的时候,这个键对应的条目也会被自动移除。WeakHashMap也可以方便的转为HahMap或者Map。如果没有任何强引用引用弱引用的对象的话,使用get()方法时候,很可能会返回null(除非GC还未发现)弱引用是和引用队列(ReferenceQueue)相关联的,一旦弱引用开始返回null,该弱引用指向的对象被标记成了垃圾,而这个弱引用就没有什么用了。引用队列是跟踪不需要的引用,像上面这种情况的弱引用,JVM就把它加入到ReferenceQueue,然后,在固定的周期,便可以处理这个引用队列。
软引用(SoftReference):如果一个对象只具有软引用,内存空间足够,GC不回收它,如果内存空间不足了,GC回收该对象的内存。
只要没回收,该对象就能被程序使用 。软引用可以用来实现内存敏感告诉缓存。(Soft references are for implementing memory-sensitive caches)
虚引用(PhantomReference):顾名思义,形同虚设,它决定不了对象的生命周期,如果一个对象仅仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被GC回收。
那么它的存在有什么意义呢?
用来跟踪对象被GC回收的活动,虚引用必须和引用队列联合使用。当GC准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被以引用对象是否要被回收 。如果发现已经加入到引用队列中,那么就在所引用的对象被回收前采取必要的行动了。
PhantomReference的get()方法总是返回null,所以你得不到它的引用对象。
三种类型的引用定义了三种不同的层次可达性级别,由强到弱排列如下:
StrongReference>softReferenc>WeakReference>PhantomReference