软引用
软引用是一种相对强引用弱化了一些的引用,要求用java.lang.ref.SoftRerence类来实现,可以让对象豁免一些垃圾收集。
对于只有软引用的对象来说:
【当系统内存充足时它 不会 被收回】,
【当系统内存不足时它 会 被收回】。
软引用通常用在对内存敏感的程序中,比如高速缓存就有用到软引用,内存够用的时候就保留,不够用就回收。
代码演示
内存够用
import java.lang.ref.SoftReference;
public class SoftReferenceDemo {
//内存够用的时候就保留,不够用就回收.
public static void softRefMemoryEnough(){
Object o1 = new Object();
SoftReference<Object> softReference = new SoftReference<>(o1);
System.out.println(o1);
System.out.println(softReference.get());
o1 = null;
System.gc();//手动启动GC
System.out.println(o1);
System.out.println(softReference.get());
}
/**
* JVM配置,故意产生对象并配置小的内存,让它内存不够用了导致OOM,看软引用的回收情况
* -Xms5m -Xmx5m -XX:+PrintGCDetails
*/
public static void softRefMemoryNotEnough(){
Object o1 = new Object();
SoftReference<Object> softReference = new SoftReference<>(o1);
System.out.println(o1);
System.out.println(softReference.get());
o1 = null;
try {
//占用内存new个大对象
byte[] bytes = new byte[30 * 1024 * 1024];
}catch (Throwable e){
e.printStackTrace();
}finally {
System.out.println(o1);
System.out.println(softReference.get());
}
}
public static void main(String[] args) {
softRefMemoryEnough();
// softRefMemoryNotEnough();
}
}
运行结果
内存不够用演示
第一步 放开注释代码调用softRefMemoryNotEnough();方法
public static void main(String[] args) {
// softRefMemoryEnough();
softRefMemoryNotEnough();
}
第二步 设置JVM配置如图
在run -> Edit Configurations
运行结果如下: