码迷,mamicode.com
首页 > 其他好文 > 详细

强引用,软引用,弱引用,幻想引用有什么区别

时间:2018-11-20 16:21:30      阅读:297      评论:0      收藏:0      [点我收藏+]

标签:static   source   tom   final   nal   weakref   exception   需要   public   

一:分析引用主要是对垃圾回收,对象可达

二:强引用是判断对象是否存活,软引用是内存不足时,就回收,可以作为缓存。弱引用可以构建一种没有强制约束关系的,也可以作为缓存。幻想引用就是对象被finalize之后做一些清理工作

三:技术分享图片

四:所有的引用都是java.lang.ref.Refrence的子类,有get()方法。说明软引用,弱引用都可以获得对象,变成强引用。幻想引用的get都是null.

五:弱引用可能指向了强引用,垃圾回收不了,造成内存泄漏

六:Object counter = new Object();
ReferenceQueue refQueue = new ReferenceQueue<>();
PhantomReference<Object> p = new PhantomReference<>(counter, refQueue);
counter = null;
System.gc();
try {
    // Remove 是一个阻塞方法,可以指定 timeout,或者选择一直阻塞
    Reference<Object> ref = refQueue.remove(1000L);
    if (ref != null) {
        // do something
    }
} catch (InterruptedException e) {
    // Handle it
}
引用队列的使用。

七:-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintReferenceGC
 打印引用数量
0.403: [GC (Allocation Failure) 0.871: [SoftReference, 0 refs, 0.0000393 secs]0.871: [WeakReference, 8 refs, 0.0000138 secs]0.871: [FinalReference, 4 refs, 0.0000094 secs]0.871: [PhantomReference, 0 refs, 0 refs, 0.0000085 secs]0.871: [JNI Weak Reference, 0.0000071 secs][PSYoungGen: 76272K->10720K(141824K)] 128286K->128422K(316928K), 0.4683919 secs] [Times: user=1.17 sys=0.03, real=0.47 secs]

 

八:通过底层api,达到强引用

class Resource {
 private static ExternalResource[] externalResourceArray = ...
 int myIndex; Resource(...) {
     myIndex = ...
     externalResourceArray[myIndex] = ...;
     ...
 }
 protected void finalize() {
     externalResourceArray[myIndex] = null;
     ...
 }
 public void action() {
 try {
     // 需要被保护的代码
     int i = myIndex;
     Resource.update(externalResourceArray[i]);
 } finally {
     // 调用 reachbilityFence,明确保障对象 strongly reachable
     Reference.reachabilityFence(this);
 }
 }
 private static void update(ExternalResource ext) {
    ext.status = ...;
 }
}

new Resource().action()

这里resource 没有被强引用,所以可以finalize,

 

static void reachabilityFence(Object ref)

 

强引用,软引用,弱引用,幻想引用有什么区别

标签:static   source   tom   final   nal   weakref   exception   需要   public   

原文地址:https://www.cnblogs.com/hanguocai/p/9989289.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!