强引用Strong References
强引用是最多见的引用:html
好比:java
StringBuffer buffer = new StringBuffer();
建立了一个StringBuffer类的对象,并用一个变量buffer存储对这个对象的引用。这就是个强引用。程序员
变量持有的是这个对象的引用。一般,引用是一个对象的存储地址。api
Java不像C或者C++同样,Java没有取地址符号&,也没有解引用符号*或者->。缓存
引用不一样于指针,引用不能与整形进行互相转换,也不能进行增减操做。markdown
强引用是和垃圾回收机制相关的。oracle
通常的,若是一个对象能够经过一系列的强引用引用到,那么就说明它是不会被垃圾回收机制(Garbage Collection)回收的。ide
由于垃圾回收是不会回收你正在使用的对象的。性能
垃圾回收机制Garbage Collection
若是一个对象,没有一个引用指向它,那么它就被认为是一个垃圾。flex
An object is considered garbage when there are no longer any references to it stored in any variables, the fields of any objects, or the elements of any arrays.
在某一个时间,garbage collector将会发现成为垃圾的对象,而后回收它所占用的内存。
C中用malloc()和free()来管理内存。
C++是用new和delete来分配和管理内存空间。
而Java使用garbage collection机制,不用程序员写代码管理,这样会有一些性能上的影响,由于garbage collector会主动地回收内存。
可是,GC机制减小了内存泄露,而且提升了程序员的效率。
何时强引用会太强了?
有时候应用会使用一些不能被继承的类,好比一个final的类,或者一个工厂方法返回的接口,并不知道有多少具体实现。
而咱们想给这个类增长一个字段,好比给每个对象一个序列号,因而咱们用了HashMap,把这个类的对象做为key,一个序列号做为value。
这时候咱们就必须100%肯定地知道一个特定对象的序列号何时再也不须要(好比对象的生命周期已经结束,就再也不须要它的序列号属性),这样咱们就能够从map中移除它的entry。
若是咱们在应当移除引用的时候没有移除,垃圾回收将一直不会回收这个对象,引发内存泄露。
而若是咱们过早地移除了咱们还在使用的对象的引用,又会发现本身丢失了信息。
这些都是C/C++程序员常常会遇到的问题。而咱们用的是Java,咱们还要考虑这些,岂不是闹复杂了?
强引用另外一个常见的问题是缓存问题。
比方说,图像的缓存。图像缓存应当阻止咱们重复载入图像。
因此图像缓存保存有内存中已有的全部图像的引用,若是使用一般的强引用,强引用自己会使得图像一直存留在内存中,这样就使得程序员像上面同样,必须本身决定何时移除缓存中的引用,这样对象才能被垃圾回收机制回收。
这样你就又放弃了让GC本身管理垃圾回收的机制,而开始手动地管理内存。
引用对象类
Java的引用对象类在包java.lang.ref下。
http://docs.oracle.com/javase/7/docs/api/java/lang/ref/package-summary.html#package_description
其中包含了三种显式的引用类型(也便是Reference类的三个子类):
SoftReference
WeakReference
PhantomReference
一个引用对象(reference object)(即以上三种引用类型的对象)封装了一个对其余对象的引用(称做referent)。
引用对象提供了对referent的clean和get操做,可是不提供set操做。
引用对象自己能够像其余通常的对象同样被检查和操纵。
三种类型的引用定义了三种不一样层次的可达性级别,由强到弱排列以下:
SoftReference > WeakReference > PhantomReference
越弱表示对垃圾回收器的限制越少,对象越容易被回收。
SoftReference
SoftReference用来实现一些内存敏感的缓存(Soft references are for implementing memory-sensitive caches),只要内存空间足够,对象就会保持不被回收。
反之,当宿主进程的内存空间不足时,对象就会被GC回收。
因此SoftReference意味着:hold on until you can’t.
WeakReference
WeakReference能够用来实现一些规范化映射(WeakHashMap),其中key或者value当它们再也不被引用时能够自动被回收。
当你想引用一个对象,可是这个对象有本身的生命周期,你不想介入这个对象的生命周期,这时候你就是用弱引用。
这个引用不会在对象的垃圾回收判断中产生任何附加的影响。
PlantomReference
PlantomReference和WeakReference同样,也不会介入引用对象的生命周期。
PhantomReference用来调度一些预验清理动做,提供比Java清理机制更灵活的处理方式。(Phantom references are for scheduling pre-mortem cleanup actions in a more flexible way than is possible with the Java finalization mechanism.)
PlantomReference比较特殊,它的get方法老是返回null,因此你得不到它引用的对象。
它保存ReferenceQueue中的轨迹。
它容许你知道对象什么时候从内存中移除。