JVM中GC Roots及引用类型概述
-
活动线程(Active threads):正在执行的线程被视为GC Roots,因为它们持有当前执行状态的信息。
-
静态变量(Static variables):被声明为静态的变量属于类,因此它们会一直存在于内存中。
-
JNI引用(JNI references):Java Native Interface(JNI)引用是在Java代码中与本地(非Java)代码进行交互时创建的对象引用。
-
方法区中的类静态属性引用(Class static properties references):方法区中的类静态属性引用持有对其他对象的引用。
-
栈帧中的局部变量引用(Local variables references in stack frames):栈帧中的局部变量引用指向堆中的对象。
-
常量引用(Constant references):在编译时被确定为常量的引用。
在Java中,有以下几种引用类型:
-
强引用(Strong Reference):最常见的引用类型,也是默认的引用类型。强引用通过普通的对象引用方式来引用对象,只要强引用存在,垃圾收集器就不会回收被引用的对象。
-
软引用(Soft Reference):通过软引用来引用对象的话,只有在内存不足时,垃圾收集器才会回收被软引用引用的对象。软引用可以用于实现内存敏感的高速缓存。
-
弱引用(Weak Reference):弱引用的生命周期更短暂,即使内存充足,只要垃圾收集器运行,就可能回收被弱引用引用的对象。
-
虚引用(Phantom Reference):虚引用是最弱的引用类型。虚引用主要用于跟踪对象被垃圾收集器回收的活动。无法通过虚引用访问对象的任何属性或方法,也无法通过虚引用获取对象的实例。
举例:
Student stu = new Student(); //强引用类型 SoftReference<CacheObject> cacheRef = new SoftReference<>(new CacheObject()); //软引用类型需要利用java.lang.ref.SoftReference创建和使用 WeakReference<String> weakRef = new WeakReference<>("Hello"); //弱引用需要利用java.lang.ref.WeakReference创建和使用 PhantomReference<TestObject> phantomReference = new PhantomReference<>(new TestObject(), queue); //虚引用需要利用java.lang.ref.PhantomReference创建和使用
值得注意的是,软引用和弱引用可以利用get()方法获得所引用的对象,但是虚引用不行。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理