java_强、软、弱、虚四大引用
1.Java_第一季_JAVASE_自增、单例模式、类与实例初始化过程、方法参数传递机制、递归和迭代、成员变量与局部变量2.Java_第一季_SSM_Spring Bean的作用域、Spring事务的传播行为、Spring MVC的执行流程、3.Java_第一季_java高级_Redis持久化、MySql何时建立索引4.java_JUC、volatile5.java_CAS6.java_阻塞队列(FIFO先进先出)7.JUC下countDownLatch、CyclicBarrier、Semaphore以及枚举的常见使用方法8.java_锁9.java_集合不安全10.Spring循环依赖11.AbstractQueuedSynchronizer---AQS12.LockSuport13.java_线程池7大参数_底层运行原理14.java_线程池三个常用方式15.Java_Callable<V>的基本使用16.java_锁_synchronized与Lock的区别
17.java_强、软、弱、虚四大引用
18.java_OOM19.JAVA-interview20.java_NIO21.java_JVM之GC22.java_JVM23.单例模式设计24.netty服务端、客户端简单搭建25.java使用webSocket与前端通讯26.java串口通讯27.用Java读取文件文字并语音播报28.Proguard-混淆29.Spring Security30.MQ31.spring相关面试题32.执行jar包33.Spring34.SpringBoot数据访问35.Java Stream(流)基本使用36.java集合工具类 Collections基本使用37.LocalDateTime、LocalDate、Date、String相互转化38.java8新特性39.java设计模式40.java springboot使用定时器41.MQ根据正常队列、死信队列来实现延迟队列的场景
1、强引用(默认使用)
//强引用 public class StrongReferenceDemo { public static void main(String[] args) { Object obj1 = new Object();//这样定义的,默认就是强引用 Object obj2 = obj1; obj1 = null; System.gc();//手动启动GC System.out.println(obj2); } }
2、软引用
import java.lang.ref.SoftReference; /** * 软引用:内存够用,不回收,内存不够就回收; */ public class SoftReferenceDemo { public static void main(String[] args) { //softRef_Memory_Enough(); softRef_Memory_NotEnough(); } //内存够用 private static void softRef_Memory_Enough() { Object o1 = new Object(); SoftReference<Object> soft = new SoftReference<>(o1); System.out.println(o1); System.out.println(soft.get()); o1 = null; System.gc();//手动GC System.out.println(o1); System.out.println(soft.get()); } /** * 内存不够用,自动GC,故意产生大对象并配置小内存,让它内存不够用导致OOM, * 看软引用的回收情况 */ private static void softRef_Memory_NotEnough() { Object o1 = new Object(); SoftReference<Object> soft = new SoftReference<>(o1); System.out.println(o1); System.out.println(soft.get()); o1 = null; try { byte[] bytes = new byte[30 * 1024 * 1024]; } catch (Exception e) { e.printStackTrace(); }finally { System.out.println(o1); System.out.println(soft.get()); } } }
3、弱引用
内存不管够不够,只要gc,就会回收!
import java.lang.ref.WeakReference; /** * 弱引用 只要GC,就会回收 */ public class WeakReferenceDemo { public static void main(String[] args) { Object o1 = new Object(); WeakReference<Object> weak = new WeakReference<>(o1); System.out.println(o1); System.out.println(weak.get()); o1 = null; System.gc(); System.out.println(o1); System.out.println(weak.get()); } }
WeakHashMap
import java.util.HashMap; import java.util.WeakHashMap; public class WeakHashMapDemo { public static void main(String[] args) { myHashMap(); System.out.println("======"); myWeakHashMap(); } private static void myHashMap() { HashMap<Integer, String> map = new HashMap<>(); Integer key = new Integer(1); String value = "HashMap"; map.put(key,value); System.out.println(map); key = null; System.out.println(map); System.gc(); System.out.println(map); } private static void myWeakHashMap() { WeakHashMap<Integer, String> map = new WeakHashMap<>(); Integer key = new Integer(1); String value = "HashMap"; map.put(key,value); System.out.println(map); key = null; System.out.println(map); System.gc(); System.out.println(map); } }
4、虚引用
import java.lang.ref.ReferenceQueue; import java.lang.ref.WeakReference; public class ReferenceQueueDemo { public static void main(String[] args)throws Exception { Object o1 = new Object(); ReferenceQueue<Object> queue = new ReferenceQueue<>(); WeakReference<Object> weak = new WeakReference<>(o1,queue); System.out.println(o1); System.out.println(weak.get()); System.out.println(queue.poll()); System.out.println("-====="); o1 = null; System.gc(); Thread.sleep(500); System.out.println(o1); System.out.println(weak.get()); System.out.println(queue.poll()); } }
虚引用
import java.lang.ref.PhantomReference; import java.lang.ref.ReferenceQueue; /** * 虚引用 */ public class PhantomReferenceDemo { public static void main(String[] args)throws Exception { Object o1 = new Object(); ReferenceQueue<Object> queue = new ReferenceQueue<>(); PhantomReference<Object> phantom = new PhantomReference<>(o1,queue); System.out.println(o1); System.out.println(phantom.get()); System.out.println(queue.poll()); System.out.println("==="); o1 = null; System.gc(); Thread.sleep(500); System.out.println(o1); System.out.println(phantom.get()); System.out.println(queue.poll()); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?