参考文章:https://www.cnblogs.com/wjh123/p/11142176.html
https://www.bilibili.com/video/BV117411g7ib?from=search&seid=660483692485420103
强引用:通过关键字new创建的对象所关联的引用就是强引用,如Object obj=new Object();
JVM内存空间不足,JVM宁愿抛出OutOfMemoryError运行时错误(OOM),使程序异常终止,也不会靠随意回收具有强引用的“存活”对象来解决内存不足的问题。对于一个普通的对象,如果没有其他的引用关系,只要超过了引用的作用域或者显式地将相应强引用赋值为 null,就是可以被垃圾收集的了,但不会被立即回收,具体回收时机还是要看垃圾收集策略。
内存不足时垃圾回收器不能随意回收强引用的对象
软引用:软引用通过SoftReference类实现,只有当 JVM 认为内存不足时,才会去试图回收软引用指向的对象,即JVM 会确保在抛出OutOfMemoryError之前,清理软引用指向的对象。
应用场景:软引用通常用来实现内存敏感的缓存。如果还有空闲内存,就可以暂时保留缓存,当内存不足时清理掉,这样就保证了使用缓存的同时,不会耗尽内存。

//运行前先指定虚拟机内存20M,软应用对象占用10M,当有一个20M的对象时,查看软应用会被gc自动回收
@Test
public void test3() throws InterruptedException {
SoftReference<byte[]> softReference = new SoftReference<byte[]>(new byte[1024*1024*10]);
System.out.println(softReference.get());//[B@159424e2
system.gc(); //gc不会主动去回收弱引用
Thread.sleep(1000);
System.out.println(softReference.get());//[B@159424e2
byte[] bytes = new byte[1024 * 1024 * 20];
System.out.println(softReference.get()); //null
}
弱引用:弱引用通过WeakReference类实现,WeakReference对象指向的对象,就是弱引用。
弱引用的特点:遇到gc就会被回收
虚引用:虚引用也叫幻象引用,通过PhantomReference类来实现。
如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。当一个虚引用关联的对象被垃圾收集器回收之前会收到一条系统通知。
应用场景:当JVM中内存的某个对象引用了堆外内存中的某个对象时,当JVM内存中的对象不存在时,就会发一条消息通知JVM可以清理堆外内存了,gc线程就会去清理堆外内存
本文深入探讨Java中的四种引用类型:强引用、软引用、弱引用和虚引用的特性和应用场景,以及它们如何影响内存管理和垃圾回收过程。
713

被折叠的 条评论
为什么被折叠?



