Java的四种引用
1.强引用
最常见的引用类型,即使内存不够也不会回收。
思考:obj1这个强引用自身是否也是对象?占用内存吗?
public class StrongReferenceDemo {
public static void main(String[] args) {
//obj1是一个强引用,指向new出来的实际对象
Object obj1 = new Object();
Object obj2 = obj1;
obj1 = null;
System.gc();
System.out.println(obj2);
}
}
输出结果:java.lang.Object@4d7e1886
2.软引用
内存不够了就回收仅有软引用指向的对象,内存够的时候不用管。
package com.shin.demo05;
import java.lang.ref.SoftReference;
public class SoftReferenceDemo {
public static void memoryEnough(){
Object obj1 = new Object();
//创建一个软引用,指向强引用obj所指的对象。
SoftReference<Object> softReference = new SoftReference<Object>(obj1);
System.out.println(obj1);
System.out.println(softReference.get());
obj1 = null;
System.gc();
System.out.println(obj1);
System.out.println(softReference.get());
}
//-Xms5m -Xmx5m 故意制造OOM
public static void memoryNotEnough(){
Object obj1 = new Object();
SoftReference<Object> softReference = new SoftReference<Object>(obj1);
System.out.println(obj1);
System.out.println(softReference.get());
//此时只剩软引用
obj1 = null;
try{
byte[] bytes = new byte[300*1024*1024];
}catch (Throwable e){
e.printStackTrace();
}finally {
System