JAVA中的四大引用
Object obj=new Object();
-Xmx24M
/** * 软引用demo * SoftReference * 1.当内存不足的时,JVM就会把软引用对象进行回收 * 2.如果回收后还是没有足够的内存,才会抛出内存溢出异常 */ public static void main(String[] args) throws InterruptedException { SoftReference<byte[]> s=new SoftReference<>(new byte[1024*1024*10]);//10m System.out.println(s.get()); System.gc();//启动GC Thread.sleep(500); System.out.println(s.get()); //再创建一个数组,堆中存不下的时候,垃圾回收器工作 //先回收一次,如果第一次回收后内存还是不够 //则再清理第二次,这一次会把软引用对象清除 byte[] b=new byte[1024*1024*15];//15m System.out.println(s.get());//null }
[B@2a139a55 [B@2a139a55 null
-XX:+PrintGC //打印简单的GC日志 -XX:+PrintGCDetails //打印详细的GC日志
SoftReference<byte[]> s=new SoftReference<>(new byte[1024*1024*10]);
/** * 弱引用demo * WeakReference * 不管内存够不够,都会进行回收 */ public static void main(String[] args) { WeakReference<Object> w=new WeakReference<Object>(new Object()); System.out.println(w.get()); System.gc(); System.out.println(w.get()); }
java.lang.Object@2a139a55 null
Object obj=new Object(); PhantomReference<Object> objRef=new PhantomReference<Object>(obj,null); System.out.println("获取虚引用所指向的对象"+objRef.get()); System.out.println(objRef.get().equals(obj));//尝试调用对象中的方法
获取虚引用所指向的对象null Exception in thread "main" java.lang.NullPointerException at com.sy.Reference.Test_phantom.main(Test_phantom.java:14)
/** * 虚引用 * 管理堆外内存 */ public class Test_PhantomReference { //引用队列 private static final ReferenceQueue<Object> QUEUE=new ReferenceQueue<>(); public static void main(String[] args) { //当虚引用对象被回收时,会把一个信息填入到引用队列中 PhantomReference<Object> p=new PhantomReference<Object>(new Object(),QUEUE); System.out.println("第一次获取虚引用指示的对象"+p.get());//null System.out.println("第一次获取虚引用的地址值"+p); List<byte[]> list=new ArrayList<>(); new Thread(()->{ boolean flag=true; try { while(flag) { //不断去new新的对象,内存不足时GC就会启动 list.add(new byte[1024*1024]); } } catch (Exception e) { e.printStackTrace(); }finally { flag=false; System.out.println("第二次获取虚引用指示的对象"+p.get()); } }).start(); /* 再开启一个线程,做一个监控 * 当虚引用被回收时,会发送一个通知 * 如果引用队列QUEUE中不再是null * 证明虚引用已经被回收 */ new Thread(()->{ boolean flag=true; while(flag) { Reference<? extends Object> poll = QUEUE.poll(); if(poll!=null) { flag=false; System.out.println("虚引用对象"+poll+"被回收了"); } } }).start(); } }