JAVA有5中引用类型,strong,soft, weak,phantom,final
- 强引用: 最常用的引用,我们平常写的 XXX xxx = new XXX,没有引用时回收
- SoftReference:如果一个对象只剩下一个soft引用,在jvm内存不足的时候会将这个对象进行回收。队列中的 PhantomReference 的 referent 为空。回收之后放入队列
- WeakReference:如果对象只剩下一个weak引用,那gc的时候就会回收。官方说时用在规范化mapping。例如 WeakHashMap。队列中的 PhantomReference 的 referent 为空。回收之后放入队列
- PhantomReference(虚引用):就像它的名字一样形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。gc时发送通知然后回收,主要用来在回收时处理一些逻辑,比如 Cleaner。队列中的 PhantomReference 的 referent 不为空。回收之前放入队列
- FinalReference (Finalizer):当重写 Object 的finalize() 方法后 JVM 会给该类添加 finalizer 标记,同时生成一个 FinalReference。主要用来调用 finalize() 方法,通过使用低优先级的守护线程实现对 finalize() 的调用,该类被回收至少需要经过2次GC,第一次是将 FinalReference 放入ReferenceQueue 供 Finalizer 的守护线程使用(即调用 finalize()),第二次才能被回收。这里有个问题就是 Finalizer 的 守护线程不知道什么时候会被调用,所以这些对象可能一直会被回收,导致oom
SoftReference和WeakReference 都可以用来做缓存,只是生命周期不一样。
参考:
https://www.infoq.cn/article/jvm-source-code-analysis-finalreference/
https://www.jianshu.com/p/e66930caca9c
https://www.jianshu.com/p/fdd4c16601f9
网友评论