GC Root

news2024/11/25 12:29:19

开章,不知道有没有小伙伴跟我一样,在快要毕业或者换工作的时候疯狂刷八股文,这样做有什么坏处呢

  1. 好多面试题自己都是靠死记硬背,这也是我们过后压根记不着这些内容的原因;
  2. 每次面试问题需要自己反复去刷,甚至工作的时候有人谈到了,自己都需要取翻看知识点;
  3. 在面试的时候有些问题不熟悉,又担心被面试官问到,提心吊胆。

于是,我萌生了一个想法,如果我把问题全部搞懂呢,

  1. 会不会有工作帮助呢?
  2. 会不会拓宽我们的思路呢?
  3. 会不会让面试官刮目相看呢?(可以跟面试官聊一下自己探索问题的过程)。

在 Java 编程中,垃圾回收(Garbage Collection)是一个非常重要的概念,用于管理内存中不再被引用的对象,并释放它们占用的内存空间。但要理解垃圾回收是如何工作的,首先需要了解什么是 JVM GC Root。

什么是GC Root

GC Root(垃圾回收根对象)是指那些被直接引用的对象,它们不会被垃圾回收机制回收。GC Root 对象通常是内存中的起始点,垃圾回收器从这些对象开始跟踪和清理内存中不再被引用的对象,以释放内存空间。

GC Root 对象通常包括以下几种类型:

  1. 局部变量表(Local Variables)中的对象引用: 这包括当前执行线程中的本地变量、方法参数和返回值等。
  2. 本地方法栈中的对象引用: 本地方法栈是用于执行本地(非 Java)方法的栈,其中也包含对象引用。
  3. 活动线程(Active Threads): 活动线程本身被认为是 GC Root,因为它们持有对线程本地变量表的引用,这些变量可能引用其他对象。
  4. 静态变量(Static Variables): 静态变量属于类而不是实例,因此它们在整个应用程序生命周期内都存在,并且可以被认为是 GC Root。
  5. JNI 引用(JNI References): 如果 Java 代码使用 Java Native Interface (JNI) 调用了本地代码,JNI 引用的对象也被认为是 GC Root。
  6. 类加载器: 类加载器也可以被认为是 GC Root,因为它们负责加载类及其相关资源,从而保持了对类的引用。
  7. 常量池中的对象(Objects in Constant Pool): 常量池中的字符串常量和其他常量通常也被认为是 GC Root,因为它们是全局的,并且可以在整个应用程序的生命周期内访问。

这里我尝试运行了一个测试程序,并导出dump文件,通过软件,我们可以看到活动线程、常量池中的对象作为了GC Root,这里就不一一截图,有兴趣的小伙伴可以自己探索。

在这里插入图片描述

对象存活的判断

  1. 引用计数法(Reference Counting):

引用计数法是一种简单的垃圾回收算法,它通过在每个对象上维护一个引用计数器,记录着指向该对象的引用数量。当引用数量减少到零时,表示该对象不再被引用,可以被回收。

在这里插入图片描述

优点:

  • 简单,实现容易。
  • 可以迅速地判断对象是否存活。

缺点:

  • 无法解决循环引用问题。如果两个或多个对象相互引用,但与其他对象无关,它们的引用计数永远不会减为零,导致无法回收。
  • 需要额外的内存空间来存储引用计数器,增加了内存开销。
  • 需要维护引用计数器的增减操作,可能会影响程序性能。
  1. 可达性分析法(Reachability Analysis):

    可达性分析法是一种更广泛使用的垃圾回收算法,它基于对象之间的引用关系来判断对象是否存活。它从一组称为 GC Roots 的起始对象出发,通过遍历对象引用关系图,找到所有可以从 GC Roots 访问到的对象,而其他对象则被判定为不可达,可以被回收。
    在这里插入图片描述
    在这里插入图片描述

    优点:

    • 能够解决循环引用问题,因为只要这些对象与 GC Roots 之间没有引用链相连,它们都会被回收。
    • 不需要维护引用计数器,减少了内存开销。
    • 适用于复杂的对象引用关系。

    缺点:

    • 需要进行全局性的遍历和分析,可能会消耗较多的 CPU 和内存资源,造成一定的性能损失。
    • 可能导致一些短期存活的对象被错误回收(假阴性),或者长期不被回收的对象占用内存(假阳性)。

通过工具我们可以看到哪些对象引用了GCRoot
在这里插入图片描述

在现代的 JVM 中,可达性分析法是主要采用的垃圾回收方式,因为它能够有效处理循环引用问题,同时也能够处理复杂的对象引用关系。虽然它需要进行更多的计算和分析,但 JVM 的优化和多线程处理能够降低其性能开销。

总的来说,可达性分析法是 JVM 中判断对象存活性的主要方式,而引用计数法在实际应用中较少使用,主要因为它无法解决循环引用问题。

总结

通过了解什么是 GC Root 对于我们来说是非常有帮助的,特别是在处理内存管理和垃圾回收方面,以下是一些好处:

  1. 内存泄漏诊断: GC Root 是对象保留在内存中的原因之一。了解 GC Root 可以帮助你识别潜在的内存泄漏问题,即对象被无意中保留在内存中,导致内存消耗过多的情况。
  2. 垃圾回收优化: 了解哪些对象是 GC Root 可以帮助你更好地理解垃圾回收的工作原理。这有助于你编写更具效率的代码,减少不必要的对象保留,从而减少垃圾回收的频率和成本。
  3. 性能调优: 通过了解 GC Root 对象,你可以识别潜在的性能瓶颈,特别是在内存使用方面。这有助于你优化代码以提高应用程序的性能和响应时间。
  4. 代码审查和维护: 了解 GC Root 可以帮助你在代码审查和维护过程中更好地理解代码中对象的生命周期,特别是在多线程环境中。这有助于你避免潜在的并发问题。
  5. 故障排除: 当应用程序发生内存相关的故障时,了解 GC Root 可以帮助你快速定位问题并进行故障排除。

需要与博主做技术交流的请加QQ(1719120364),博主喜欢动漫、本子、里番、switch游戏(有志同道合的可加)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/978972.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++初阶:C++入门

目录 一.iostream文件 二.命名空间 2.1.命名空间的定义 2.2.命名空间的使用 三.C的输入输出 四.缺省参数 4.1.缺省参数概念 4.2.缺省参数分类 4.3.缺省参数注意事项 4.4.缺省参数用途 五.函数重载 5.1.重载函数概念 5.2.C支持函数重载的原理--名字修饰(name Mangl…

富士康曲线救国,iPhone 15 Pro订单较上代有减少,iPhone 15增加

据外媒报道,苹果将于9月13日凌晨举行的秋季新品发布会上推出iPhone 15系列智能手机。然而,令人惊讶的是,这款备受期待的手机在8月份就已开始批量生产,以确保上市初期供应充足。 随着iPhone 15系列发布时间的临近,越来越…

Cisco 5580 ASA service 如何Console?

一、Cisco ASA 5580 需要一个9针转Rj45到头子 如图: 二、插在设备的这个接口上 就可以了

RabbitMQ从入门到精通之安装、通讯方式详解

文章目录 RabbitMQ一、RabbitMQ介绍1.1 现存问题 一、RabbitMQ介绍二、RabbitMQ安装三、RabbitMQ架构四、RabbitMQ通信方式4.1 RabbitMQ提供的通讯方式4.2 Helloworld 方式4.2Work queues4.3 Publish/Subscribe4.4 Routing4.5 Topics4.6 RPC (了解) 五、Springboot 操作RabbitM…

《C和指针》读书笔记(第十三章 高级指针话题)

目录 0 简介1 进一步探讨指向指针的指针2 高级声明3 函数指针3.1 回调函数3.2 转移表 4 命令行参数4.1 传递命令行参数4.2 处理命令行参数 5 字符串常量6 总结 0 简介 众所周知,指针是C语言的灵魂,所以本书(《C和指针》)才会将较…

为安全带来光明:光耦继电器的 10 种救生应用

在安全性和可靠性至关重要的世界中,光耦继电器已成为推动各行业进步的关键技术。这些卓越的设备经常在主流新闻中被忽视,但它们一直在默默地为保障生命和提高整体运营效率的关键系统提供动力。今天,我们重点介绍光耦继电器的十种救生应用&…

设计模式-01简单工厂模式详解 详细代码对比

目录 ChatGpt问答原生代码简单工厂模式代码 简单工厂模式(Simple Factory Pattern)新增boat 对比两种方法原生代码为什么使用强制转换?简单工厂模式 简单工厂方法总结与原生代码的区别:优点:缺点: 参考 本文将介绍什么…

golang指针的学习笔记

package main // 声音文件所在的包,每个go文件必须有归属的包 import ("fmt" )// 引入程序中需要用的包,为了使用包下的函数,比如:Printin// 字符类型使用 func main(){ // 基本数据类型,变量存的就是值&am…

做tiktok怎么运营?

一、揭开tiktok的神秘面纱 说到tiktok,你可能想到的是那些精彩的短视频,以及那些在几秒钟内就能吸引无数粉丝的创作者。然而,tiktok的魅力远不止于此。这个全球最受欢迎的短视频社交平台,正以惊人的速度改变着社交媒体的面貌。 二…

【IR】Vision-Language Tracking

调研:视觉-语言跟踪 0x01 Transformer vision-language tracking via proxy token guided cross-modal fusion, PRL2023AbstractIntroductionContribution效果Conclusion 0x02 Divert More Attention to Vision-Language Object Tracking, NeurIPS2022AbstractIntro…

起飞!Python 3.11的10个高效新特性

性能有巨大的提升是Python 3.11的一个重要的改进,除此以外Python 3.11还有增加了许多新的特性。在本文中我们将介绍Python 3.11新特性,通过代码示例演示这些技巧如何提高生产力并优化代码。 1、模式匹配 Python 3.11引入了模式匹配,可以简化…

OpenAI 函数调用教程

推荐:使用 NSDT场景编辑器 快速搭建3D应用场景 什么是OpenAI函数调用? OpenAI API 非常擅长以系统的方式生成响应。只需几行代码即可管理提示、优化模型输出以及执行、生成和语言应用程序。 即使有这么多好东西,OpenAI API对开发人员和工程…

【双指针】移动零

双指针-移动零 283. 移动零 - 力扣(LeetCode) 题目描述 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1…

03-JVM内存模型剖析与优化

1. JDK体系结构 2. Java语言的跨平台特性 3. JVM整体结构及内存模型 补充一个问题: 在minor gc过程中对象挪动后,引用如何修改? 对象在堆内部挪动的过程其实是复制,原有区域对象还在,一般不直接清理,JVM内部…

【C++基础】类与对象(上):访问限定符、类作用域、类实例化、类对象模型、this指针

​👻内容专栏: C/C编程 🐨本文概括: C基础语法。访问限定符、类作用域、类实例化、类对象模型、this指针等。 🐼本文作者: 阿四啊 🐸发布时间:2023.9.6 面向过程和面向对象初识 C语…

【网络爬虫笔记】爬虫Robots协议语法详解

Robots协议是指一个被称为Robots Exclusion Protocol的协议。该协议的主要功能是向网络蜘蛛、机器人等搜索引擎爬虫提供一个标准的访问控制机制,告诉它们哪些页面可以被抓取,哪些页面不可以被抓取。本文将进行爬虫Robots协议语法详解,同时提供…

MQ 消费者和队列对应关系

参考 Consumer and Consumer Group Load Balancing https://rocketmq.apache.org/docs/4.x/consumer/01concept2 旧版本MQ结论 消费者应用和topic队列一对多的关系。 (一个消费组consumer group里,一个消费者应用可以消费多个队列的消息。一个队列的消…

Podman安装与使用

1.Podman简介 Podman是一个无守护进程的容器引擎,用于在Linux系统上开发、管理和运行OCI容器。 Podman的主要功能包括: 创建和管理容器:Podman可以创建、启动、停止和删除容器,以及管理容器的生命周期。容器镜像管理&#xff1…

华为云云服务器评测|云耀云服务器L实例快速部署MySQL使用指南

文章目录 前言云耀云服务器L实例介绍什么是云耀云服务器L实例?产品优势智能不卡顿价优随心用上手更简单管理更省心 快速购买查看优惠卷购买 安装MySQL重置密码安装更新apt的软件源列表安装MySQL 设置用户名、密码、权限配置安全组 总结 前言 哈喽大家好&#xff0c…

lumion电脑速度太慢怎么办?还不是试试云电脑高效上云设计

在设计与渲染领域,Lumion是一款广受欢迎的3D软件,然而,使用本地电脑进行Lumion设计和渲染存在电脑卡顿崩溃,导致效率慢问题。本文将介绍Lumion设计师使用云电脑的优势,以及如何利用云电脑提高创作效率、释放无限创意。…