1.强引用(一般垃圾回收器不回收被强引用的对象)
在一般的Java程序中,见到最多的就是强引用(strong reference)。如Date date = new Date(),date就是一个对象的强引用。对象的强引用可以在程序中到处传递。很多情况下,会同时有多个引用指向同一个对象。强引用的存在限制了对象在内存中的存活时间。假如对象A中包含了一个对象B的强引用,那么一般情况下,对象B的存活时间就不会短于对象A。如果对象A没有显式的把对象B的引用设为null的话,就只有当对象A被垃圾回收之后,对象B才不再有引用指向它,才可能获得被垃圾回收的机会。比如:Object object = new Object();。这里的object就是强引用,如果是在方法中创建,那么只要局部变量表还存在,就不会被回收。
2.软引用 (内存不足的时候,对象被回收)SoftReference
软引用(soft reference)在强度上弱于强引用,通过类SoftReference来表示。它的作用是告诉垃圾回收器,程序中的哪些对象是不那么重要,当内存不足的时候是可以被暂时回收的。当JVM中的内存不足的时候,垃圾回收器会释放那些只被软引用所指向的对象。如果全部释放完这些对象之后,内存还不足,才会抛出OutOfMemory错误。软引用非常适合于创建缓存。当系统内存不足的时候,缓存中的内容是可以被释放的。但是并不是软引用的对象置null时就立马释放,是在内存不足时才释放,GC的时候并不会立马回收释放,因为GC并不一定代表内存不足。当垃圾回收器发现快要发生OOM的时候,软引用的对象就会被回收。即内存不足的时候,会回收软引用。
3.弱引用 (回收器只要发现一个对象的引用是全部是弱引用,就会回收此对象、释放内存)WeakReference
弱引用(weak reference)在强度上弱于软引用,通过类WeakReference来表示。它的作用是引用一个对象,但是并不阻止该对象被回收。如果使用一个强引用的话,只要该引用存在,那么被引用的对象是不能被回收的。弱引用则没有这个问题。在垃圾回收器运行的时候,如果一个对象的所有引用都是弱引用的话,该对象会被回收。就是在GC的时候就会立马回收
Handler中使用弱引用来保存Activity对象,就是因为Activity对象如果在Handler执行过程中被销毁回收,那么如果不使用弱引用,这时Activity在Handler中就是属于强引用,则不会被回收,这样就会造成了内存泄漏,而使用弱引用的话,就不会阻止Handler中的Activity对象被回收。
4.虚引用PhantomReference
用来记录GC回收的对象,可以用来统计哪些对象被GC回收了。随时会被回收,但是不知道什么时候会回收。
一般软引用做缓存,比如Glide中;弱引用防泄漏;虚引用测泄漏,在JVM内部做一个检查
网友评论