开始全新的学习,沉淀才会有产出,一步一脚印!
面试题系列搞起来,这个专栏并非单纯的八股文,我会在技术底层的基础上,不至于Debug,还会做一些实例的实现,实现一些简单的Demo,或者用于我做过的项目中去;
代码会同步在我的gitee中去,觉得不错的同学记得一键三连求关注,感谢:
链接: Reference
软引用,是基于SoftReference确定的,类似于代理加工实现,首次gc不回收,内存不足回收
软参考对象,由垃圾自行决定清除收集器响应内存需求。 软引用最常被用来实现内存敏感型缓存 public class SoftReference
弱引用:只要gc就删除
虚引用:配合了一个队列进行使用,gc去将虚引用的对象及其外部资源回收掉
public class TestPhantomfegerence {static class MyResource extends PhantomReference{//继承了虚引用类,构造方法中对应了 构造的 对象和队列public MyResource(String referent, ReferenceQueue super String> q) {super(referent, q);}public void clean(){System.out.println("clean");}}
进行测试
public static void main(String[] args) {ReferenceQueue queue = new ReferenceQueue<>();List list = new ArrayList<>();list.add(new MyResource(new String("a"), queue));list.add(new MyResource("b", queue));list.add(new MyResource(new String("c"), queue));//调用系统GCSystem.gc();try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}Object obj;
// gc后,如果存在资源,就打印,可以看到new的对象被打印了while((obj = queue.poll())!=null){if(obj instanceof MyResource ){((MyResource) obj).clean();}}}}
ThreadLocalMap中存在内存泄漏问题,这里可以通过一下这种方式实现
public class TestWeakReference {public static void main(String[] args) {MyweakMap map = new MyweakMap(5);map.put(0, new String("a"), "1");map.put(1, ("b"), "2");map.put(2, ("c"), "3");map.put(3, new String("d"), "3");System.out.println(map);System.gc();System.out.println(map.get("a"));System.out.println(map.get("b"));System.out.println(map.get("c"));System.out.println(map.get("d"));map.clean();System.out.println(map);}
static class MyweakMap{static ReferenceQueue
这里是通过判断当前的key是否为null来进行的
public void clean(){Object object;while((object=queue.poll())!=null){for (int i = 0; i < table.length; i++) {if(table[i]==object){table[i]=null;}}}}
如果为null,就将当前table,也就是对象Entry[]对应的单个Entry直接设置为null, static class Entry extends WeakReference
这就断开了联系
public MyweakMap(int init){table= new Entry[init];}Entry[] table;public void put(int index, String key, String value){table[index] = new Entry(key, value);}public String get(String key){for(Entry entry : table){if(entry!=null){String k = entry.get();if(k!=null&&k.equals(key)){return entry.value;}}}return null;}@Overridepublic String toString() {return "MyweakMap{" +"table=" + Arrays.toString(table) +'}';}}}
public class TestSoft {static class WeakReferenceDemo extends WeakReference {public WeakReferenceDemo(String referent) {super(referent);System.out.println(referent);}}public static void main(String[] args) {List list = new ArrayList<>();list.add(new TestSoft.WeakReferenceDemo(new String("a")));list.add(new TestSoft.WeakReferenceDemo(("b")));list.add(new TestSoft.WeakReferenceDemo(new String("c")));System.out.println(list.get(0).get());System.gc();System.out.println(list.get(0).get());}
}
结果展示 a b c a null
引用的底层很简单
public class WeakReference extends Reference {public WeakReference(T referent) {super(referent);}public WeakReference(T referent, ReferenceQueue super T> q) {super(referent, q);}}
一个泛型类
public abstract class Reference {private T referent; /* Treated specially by GC */volatile ReferenceQueue super T> queue;
链表结构
@SuppressWarnings("rawtypes")Reference next;transient private Reference discovered; /* used by VM */static private class Lock { };private static Lock lock = new Lock();private static Reference
实现了一个静态内部类ReferenceHandler
private static Lock lock = new Lock();
加载一个类锁
private static class ReferenceHandler extends Thread {ReferenceHandler(ThreadGroup g, String name) {super(g, name);}public void run() {for (;;) {Reference