https://juejin.im/post/5d06de9d51882559ee6f4212?utm_source=gold_browser_extensionjava
1.首先,四种引用以下:算法
2.四种引用的特色:数据库
强引用:被new出来的对象都是的引用都是强引用安全
eg:Student s = new Student();post
回收时机:不会被回收,会发生内存溢出。this
软引用:软引用关联的对象,在内存不够的状况下,会把这些软引用关联的对象列入垃圾回收范围中,而后进行回收,也就是说软引用并不是是彻底安全的,在内存不够的状况下是会被垃圾回收器回收掉的。spa
public static void main(String[] args) { SoftReference[] references = new SoftReference[5]; ReferenceQueue<ReferenceTestObject> referenceTestObjectReferenceQueue = new ReferenceQueue<>(); for(int i =0 ;i<5;i++){ references[i] = new SoftReference(new ReferenceTestObject("ahahh-"+i),referenceTestObjectReferenceQueue); } for(int i =0 ;i<5;i++){ Object o = references[i].get(); if(o == null){ System.out.println("null"); }else{ System.out.println(((ReferenceTestObject)o).name); } } }
使用场景:使用软引用来保存从数据库中取出的数据,具体是作了一个中间层的封装,该中间层的做用就是在get出数据的时候会去判断数据是否为null,若是是为null再次从数据库读取,读取后再放入软引用的集合中,这样的作法是能够避免内存溢出。code
弱引用:只要发生GC都会被回收掉对象
eg:ThreadLocalMap的keyblog
static class ThreadLocalMap { /** * The entries in this hash map extend WeakReference, using * its main ref field as the key (which is always a * ThreadLocal object). Note that null keys (i.e. entry.get() * == null) mean that the key is no longer referenced, so the * entry can be expunged from table. Such entries are referred to * as "stale entries" in the code that follows. */ static class Entry extends WeakReference<ThreadLocal<?>> { /** The value associated with this ThreadLocal. */ Object value; Entry(ThreadLocal<?> k, Object v) { super(k); value = v; } } ......}
虚引用
有和没有一个样:没法经过虚引用来获取对象的实例,可是仍是有做用的。、
做用就是能在这个对象被收集器回收时收到一个系统通知,实现追踪垃圾收集器的回收动做,好比在对象被回收的时候,会调用该对象的finalize方法。
ReferenceQueue 引用队列:
在建立Reference时,手动将Queue注册到Reference中,而当该Reference所引用的对象被垃圾收集器回收时,JVM会将该Reference放到该队列中,而咱们即可以对该队列作些其余业务,至关于一种通知机制。
可达性分析:
对象四、五、6都是可被回收的。 那么问题来了,哪些对象能够做为GC Roots呢? 这里给出几个,以下
虚拟机栈中引用的对象
方法区中类静态属性引用的对象
方法区中常量引用的对象
本地方法栈JNI引用的对象