强引用
GC不会回收
示例
Object obj = new Object();
软引用
内存不足时回收,常用于记录缓存图片
示例
private void test(){
User userObject = new User("小明",20);
SoftReference<User> softReference = new SoftReference<>(userObject);
userObject = null;
System.out.println(softReference.get());
System.gc();
System.out.println("执行gc完成");
//模拟OOM的情况
List<byte[]> list = new LinkedList<>();
try {
for (int i = 0; i < 100; i++) {
System.out.println("软引用状态: " + softReference.get());
list.add(new byte[1024*1024*1]);
}
} catch (Exception e) {
System.out.println("发生异常后 软引用状态: " + softReference.get());
}
}
弱引用
GC到来时回收,常用于解决内存泄露问题
示例
private void test1(){
User userObject = new User("小明",20);
//创建弱引用
WeakReference<User> weakReference = new WeakReference<>(userObject);
userObject = null;
System.out.println("弱引用状态: " + weakReference.get()); //存在
System.gc();
System.out.println("弱引用状态: " + weakReference.get()); //null
}
虚引用
GC回收时可得到一个通知,android层面不常用
示例
private void test(){
//创建接收虚引用被回收后接收日志的队列
ReferenceQueue<User> referenceQueue = new ReferenceQueue<>();
User userObject = new User("小明",20);
//创建虚引用
PhantomReference phantomReference = new PhantomReference(userObject,referenceQueue);
userObject = null;
System.out.println("虚引用状态: " + phantomReference.get()); //存在
System.out.println("队列状态: " + referenceQueue.poll()); //null
System.gc();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("虚引用状态: " + phantomReference.get()); //不存在
System.out.println("队列状态: " + referenceQueue.poll()); //接收到了回收信息
}