首页 > 其他分享 >JVM之GC篇:(一)引用计数与可达性分析

JVM之GC篇:(一)引用计数与可达性分析

时间:2024-06-06 22:29:16浏览次数:22  
标签:对象 回收 计数 GC 引用 JVM 可达性

文章目录

0x00 前言

GC的第一步就是要判断出哪些对象需要被回收。显然易见的是,当一个对象不再被使用后,那么就需要对其进行回收。那么问题就是,如何判断对象是否被使用?本文将介绍两种算法来判断对象的使用情况。

0x01 引用计数

简而言之,引用计数就是为每一个对象增加一个计数器,当对象被引用时,计数器加一,而当对象的引用消失时,计数器减一。在每一轮GC开始时,扫描堆中所有对象的计数器,并回收那些计数为0的对象。

引用计数的优点是实现简单,但是它有十分明显的缺点:

  1. 计数器的并发读写。当对象被多个线程共享时,那么每一次修改计数值都需要使用锁或者其它机制防止出现并发问题,当对象被频繁访问时这是很大一部分的性能开销。
  2. 循环引用。考虑这样一个场景,对象A引用了对象B,而对象B又引用了对象A,那么即使其它所有对象都解除了关于对象A、B的引用,它们的计数器仍然保留为1,因此永远不会被GC回收。

在这里插入图片描述

0x02 可达性分析

Java使用可达性分析来判断对象时候需要被回收。所谓可达性,指的是从根对象(GC root)出发,如果可以沿着引用链找到该对象,则称该对象是可达的,否则就是不可达的,需要被回收。而根对象则会一直保留,不会被GC回收。

那么哪些对象属于根对象呢?主要分为以下四类:

  1. Thread类关联的对象。当线程在执行时,其当前栈帧上的局部对象不会被GC回收,由这些局部对象出发,可以找到被引用的对象以及不可达的对象。
  2. Class对象。Class对象包含了一些类的静态对象,这些对象同样作为静态对象,并且由此产生了一颗对象树,在这颗树上的所有对象是可达的。
  3. 监视器对象。synchronized关键字持有的对象,这些对象产生线程竞争时需要的锁,同样也不可以被回收。
  4. JNI引用的对象。这部分由JVM来管理,作为应用程序员不用去关注。

在这里插入图片描述

0x03 总结

引用计数算法虽然简单,但是无法解决循环依赖的问题,因此大部分场景下不会使用它。Java中选择使用可达性分析来判断对象是否需要被回收,其优点在于较高的回收性能以及不存在循环引用问题。但是可达性分析仍然存在问题,因为在程序运行过程中对象的引用关系是不断发生变化的,那么在进行可达性分析时如果不暂停程序,就可能出现错误的引用关系判断,而一旦长时间地暂停程序,则造成卡顿问题。这个问题是否无解呢?

标签:对象,回收,计数,GC,引用,JVM,可达性
From: https://blog.csdn.net/weixin_44224167/article/details/139510894

相关文章

  • DsExcel:GcExcel 7.1.X 定制Crack
    DsExcel:GcExcel--高速JavaExcel电子表格API库Excel文档解决方案(DsExcel,以前称为GcExcel)Java版允许您以编程方式在Java应用程序中创建、编辑、导入和导出Excel电子表格。几乎可以在任何地方部署。创建、加载、编辑和保存ExcelXLSX电子表格存到扩展,PDF,HT......
  • C语言:详解gcc驱动程序完成编译、汇编、链接的过程
    相关阅读C语言https://blog.csdn.net/weixin_45791458/category_12423166.html?spm=1001.2014.3001.5482    gcc是一个命令,严格意义上说,它只是一个驱动程序,而不是一个编译器。gcc负责调用GNU工具链中的预处理器、编译器、汇编器、链接器等工具,通过传递不同的选项给g......
  • SpringCloud 负载均衡 spring-cloud-starter-loadbalancer
    简述spring-cloud-starter-loadbalancer是SpringCloud中的一个组件,它提供了客户端负载均衡的功能。在SpringCloud的早期版本中,NetflixRibbon被广泛用作客户端负载均衡器,但随着时间推移和NetflixRibbon进入维护模式,SpringCloud社区开始转向更灵活、更易于维护......
  • 重塑工作场景:IngDan硬蛋AI工具在AIGC技术中的应用布局
    随着人工智能技术的飞速发展,AI工具已成为推动工作场景创新的关键力量。硬蛋学堂重新定义基于新质生产力的技术人才,为大家提供大模型应用研发工程师/大模型应用架构工程师从课程体系+实训平台+技能认证+企业用人的全方位服务!同时也可以为公司架设本地大模型工具实现基于本地化......
  • AI降痕技巧:避免AIGC检测的智能策略
    告诉大家一个非常残忍的答案,以后所有论文都会被查ai的。在考虑使用AI撰写学术论文的便捷性时,你可能会问:学术界难道没有预见到这种行为吗?答案是肯定的。学术界不仅关注传统的抄袭问题,还针对AI生成内容(AIGC)增加了一项名为“AIGC检测”的指标。这一检测的目的,正是为了识别和惩处......
  • 使用CRaC为JVM创建checkpoint
    CRaCCoordinatedRestoreatCheckpoint,缩写为CRaC,大致的原理是将JVM的当前运行状态进行持久化存储起来,再条件JDK版本:17及以上,建议17或21OpenJDK发行版,目前支持CRaC的JDK有两家:ZuluJDK:发行商为Azul,下载地址:https://www.azul.com/downloads/?version=java-17-lts&os=c......
  • 近日“AIGC”产品新增一员——腾讯元宝
             "AIGC"它通常指的是“ArtificialIntelligenceGeneratedContent”,即人工智能生成的内容。        随着人工智能技术的快速发展,特别是自然语言处理(NLP)、深度学习、生成对抗网络(GANs)和Transformer模型(如GPT系列)的进步,AI现在能够生成高质量的内容,包......
  • 每日AIGC最新进展(20):基于树的长视频理解VideoTree、IBM研究院提出AI生成图片生成检测
    DiffusionModels专栏文章汇总:入门与实战VideoTree:AdaptiveTree-basedVideoRepresentationforLLMReasoningonLongVideos本文介绍了一种名为VideoTree的新框架,旨在提高长视频理解任务中的推理能力。VideoTree通过自适应和分层的方法,动态提取与查询相关的视频帧,......
  • jvm参数模板
    8g物理内存-Xms4g-Xmx4g-Xmn2g-Xss1m-XX:MetaspaceSize=128m-XX:MaxMetaspaceSize=256m-XX:SurvivorRatio=8-XX:MaxDirectMemorySize=512m-XX:+UseConcMarkSweepGC-XX:CMSInitiatingOccupancyFraction=70-XX:+UseCMSInitiatingOccupancyOnly-XX:+UseCMSCompactAtFullC......
  • JVM学习-内存泄漏
    内存泄漏的理解和分类可达性分析算法来判断对象是否是不再使用的对象,本质都是判断一上对象是否还被引用,对于这种情况下,由于代码的实现不同就会出现很多内存泄漏问题(让JVM误以为此对象还在引用,无法回收,造成内存泄漏)内存泄漏(memoryleak)严格来说,只有对象不会再被程序......