前言:
System.gc(),实际上System.gc()调用的又是 Runtime.getRuntime().gc();
gc它的缺点就是无法根据我们的需求去回收内存,这时候就要说到java 1.2引入的4个引用类型。强软弱虚。这4个引用出现的背景实际上就是为了我们在一定程度上对gc的可控,让它变得尽量的符合我们对内存分配的预期。
强引用:
强引用就是Object o = new Object()这种,这里的强是类似强耦合这种意味,强引用即便是抛出oom也不会解除该对象在内存中占用的空间。
软引用:
一个软引用指向一个强引用所指向的堆内存中的对象时,注意这个时候是2个引用指向同一个对象,系统要抛oom的时候,gc会去回收这个对象,因此软引用也具备了”让内存对象在oom之前释放”这种能力。
例子:
public static void softrefrence() {
String str = "abc";
SoftReference<String> soft = new SoftReference<String>(str);
}
弱引用:
一个弱引用指向一个强引用所指向的堆内存中的对象时,注意这个时候是2个引用指向同一个对象,当强引用被意外销毁的时候,gc回回收它。
例子:
public static void weakrefrence() {
String str = "abc";
ReferenceQueue<WeakReference> wq; = new ReferenceQueue<>();
WeakReference wref = new WeakReference(str,wq);
System.out.println(wref.get());
str = null;
System.gc();
System.out.println(wref.get());
}
虚引用:
虚引用其实和上面讲到的各种引用不是一回事的,他主要是为跟踪一个对象何时被GC回收(结合RefrenceQuene)。在android里面也是有用到的:FileCleaner.java