首页 > 其他分享 >JVM中GC Roots及引用类型概述

JVM中GC Roots及引用类型概述

时间:2023-05-23 09:02:16浏览次数:57  
标签:收集器 对象 GC 引用 JVM new Roots

JVM中可以用作GC Roots的对象包括以下几种:

  1. 活动线程(Active threads):正在执行的线程被视为GC Roots,因为它们持有当前执行状态的信息。

  2. 静态变量(Static variables):被声明为静态的变量属于类,因此它们会一直存在于内存中。

  3. JNI引用(JNI references):Java Native Interface(JNI)引用是在Java代码中与本地(非Java)代码进行交互时创建的对象引用。

  4. 方法区中的类静态属性引用(Class static properties references):方法区中的类静态属性引用持有对其他对象的引用。

  5. 栈帧中的局部变量引用(Local variables references in stack frames):栈帧中的局部变量引用指向堆中的对象。

  6. 常量引用(Constant references):在编译时被确定为常量的引用。

这些对象被认为是GC Roots,因为它们是直接间接(比如活动线程间接持有局部变量引用)地持有其他对象的引用,从而形成对象图的根节点。垃圾收集器将从这些根节点开始,通过可达性分析算法来确定哪些对象可以被视为垃圾并进行回收。

在Java中,有以下几种引用类型:

  1. 强引用(Strong Reference):最常见的引用类型,也是默认的引用类型。强引用通过普通的对象引用方式来引用对象,只要强引用存在,垃圾收集器就不会回收被引用的对象。

  2. 软引用(Soft Reference):通过软引用来引用对象的话,只有在内存不足时,垃圾收集器才会回收被软引用引用的对象。软引用可以用于实现内存敏感的高速缓存。

  3. 弱引用(Weak Reference):弱引用的生命周期更短暂,即使内存充足,只要垃圾收集器运行,就可能回收被弱引用引用的对象。

  4. 虚引用(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()方法获得所引用的对象,但是虚引用不行。

标签:收集器,对象,GC,引用,JVM,new,Roots
From: https://www.cnblogs.com/rockdow/p/17421165.html

相关文章

  • AGC 补题笔记
    [AGC001]A.BBQEasy由于最大数肯定要和一个比自己小的数搭配保留该数,不如选择保留次大数,如此递归即解。因此将序列排序后输出序号为奇数的数即可。B.MysteriousLight观察样例,考虑重复因素,即将路径长度分割成若干个个等边三角形周长总和,可以注意到每次折射的过程实际上是将大......
  • iOS GCD 和信号量 实现 生产者和消费者模式
    GCD提供两种方式支持dispatch队列同步,即dispatch组和信号量。一、dispatch组(dispatchgroup)1.创建dispatch组dispatch_group_tgroup=dispatch_group_create();2.启动dispatch队列中的block关联到group中dispatch_group_async(group,queue,^{//。。。});3.......
  • AIGC持续火爆大模型争相推出,庞大市场造就算力供应模式演变
    本图由AI生成  黄仁勋说的AI发展迎来iPhone时刻,对NVIDIA有什么影响?文/王吉伟 近期的AIGC领域仍旧火爆异常。但火的不只是AIGC应用,还有巨头之间的AI竞赛,以及接连不断上新的AI大模型(LLM,LargeLanguageModel)。面对ChatGPT带来的技术冲击,为了研发谷歌多模态AI模型及应对......
  • TitanIDE + AIGC 编码辅助,打工人的手替 (福音)!
    近期,行云创新将ARM信创版TitanIDE与ChatGPT做了结合,不仅能满足企业研发环境信创化的需求,还能通过对AIGC等相关技术的利用提升开发效率,既保证了研发合规性又提升了研发效率。不难发现,这几个月ChatGPT在全网一直占据热榜,它是一种人工智能技术驱动的自然语言处理工具,拥有语言理......
  • 【Linux】信号 —— 信号的产生 | 信号的保存 | 信号的处理 | volalite关键字 | SIGCH
    信号1.信号的产生-信号发送前1.1键盘产生1.2异常1.3系统调用1.4软件条件1.5理解发送信号2.信号的保存-信号发送中2.1相关概念&内核结构2.2sigset_t及一系列系统调用函数3.信号的处理-信号发送后3.1内核如何实现信号捕捉3.2sigaction4.可重入函数5.volalite......
  • 微服务与springcloud的介绍
    1.什么是微服务?随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构。微服务是一种经过良好架构设计的分布式架构方案。微服务的上述特性其实是给分布式架构制定一个标准,进一步降低服务之间的耦合,提供服务的独立性和灵活性。做到高......
  • 网站监测软件配置使用 - WGCLOUD
    WGCLOUD是一款优秀的开源运维监控工具,它可以监控网站、网页、服务接口的健康状态,并支持GET和POST接口,以及对返回的内容进行校验,支持告警通知,比如邮件、钉钉、微信等,这样可以有效防止我们的网站被篡改WGCLOUD很轻量,部署很方便,本文中我们不讲述如何部署安装了,可以去网站(www.wgstart.c......
  • Golang的viper包调用多次OnConfigChange
    问题:修改了一次,而执行了两次这个函数解决方案把配置文件进行md5,保存其md5值。在调用这个函数时,再次读取文件进行md5。两者比对,如果相等就不执行下面的逻辑。这样就解决了,一模一样的配置文件,保存多次,不会执行后续的逻辑。但是,杜绝了大部分的场景,比如修改了一次,保存了两次......
  • 来谈谈jvm虚拟机
    JVM(JavaVirtualMachine)是Java虚拟机的缩写,它是一种能够在多个平台上运行Java字节码的虚拟计算机。JVM是Java语言跨平台的关键技术之一,它使得Java程序可以在不同操作系统和硬件平台上运行,而无需进行修改或重新编译。在Java编程中,开发人员将Java代码编译成字节码,然后将字节码交给JV......
  • Hugging News #0519: 我们把 HuggingChat 开源了
    每一周,我们的同事都会向社区的成员们发布一些关于HuggingFace相关的更新,包括我们的产品和平台更新、社区活动、学习资源和内容更新、开源库和模型更新等,我们将其称之为「HuggingNews」,本期HuggingNews有哪些有趣的消息,快来看看吧!重磅我们把HuggingChat开源了ChatUI......