【Java虚拟机】JVM垃圾回收机制和常见回收算法原理

news2024/12/24 23:43:49

1.垃圾回收机制

(1)什么是垃圾回收机制(Garbage Collection, 简称GC)

  • 指自动管理动态分配的内存空间的机制,自动回收不再使用的内存,以避免内存泄漏和内存溢出的问题
  • 最早是在1960年代提出的,程序员需要手动管理内存的分配和释放
  • 这往往会导致内存泄漏和内存溢出等问题,同时也增加了程序员的工作量,特别是C++/C语言开发的时候
  • Java语言是最早实现垃圾回收机制的语言之一,其他编程语言,如C#、Python和Ruby等,也都提供了垃圾回收机制

(2)JVM自动垃圾回收机制

  • 指Java虚拟机在运行Java程序时,自动回收不再使用的对象所占用的内存空间的过程

  • Java程序中的对象,一旦不再被引用会被标记为垃圾对象,JVM会在适当的时候自动回收这些垃圾对象所占用的内存空间

  • 优点

    • 减少了程序员的工作量,不需要手动管理内存
    • 动态地管理内存,根据应用程序的需要进行分配和回收,提高了内存利用率
    • 避免内存泄漏和野指针等问题,增加程序的稳定性和可靠
  • 缺点

    • 垃圾回收会占用一定的系统资源,可能会影响程序的性能
    • 垃圾回收过程中会停止程序的执行,可能会导致程序出现卡顿等问题
    • 不一定能够完全解决内存泄漏等问题,需要在编写代码时注意内存管理和编码规范

2.垃圾回收算法

(1)引用计数法

  • 基本思想,跟踪每个对象被引用的次数,当引用次数为0时,就可以将该对象回收
  • 在JVM中,每个对象都有一个引用计数器,当对象被引用时,引用计数器+1
  • 当对象被取消引用时,引用计数器-1
  • 当引用计数器为0时,该对象就可以被回收
  • 优点
    • 实现简单,回收垃圾的效率高
  • 缺点
    • 循环引用无法回收。如果两个对象互相引用,它们的引用计数器永远不会为0,因此无法被回收
    • 引用计数器开销大,每个对象都需要一个引用计数器,如果对象很多,开销就会很大

在这里插入图片描述

public class Main {
    public static void main(String[] args) {
        A a = new A();
        B b = new B();
        a.setB(b);
        b.setA(a);
        a = null;
        b = null;
        System.gc();
    }
}

class A {
    private B b;

    public void setB(B b) {
        this.b = b;
    }
}

class B {
    private A a;

    public void setA(A a) {
        this.a = a;
    }
}
  • 类A和类B相互引用,每个对象都持有对方的引用,形成了一个循环引用的环,当Main方法执行完毕后,a和b对象都置为null
  • 由于它们相互引用,它们的引用计数器都不为0,无法被垃圾回收器回收,导致内存泄漏
  • 但是上面代码却不会发生内存泄漏,因为多数jvm没有采用这个引用计数器方案,而是采用可达性分析算法

(2)可达性分析算法

  • 可达性分析算法的基本思想是通过一系列的“GC Roots”对象作为起点进行搜索。
  • 如果“GC Roots”和一个对象之间没有可达路径,则称该对象是不可达的,不过要注意的是被判定为不可达的对象不一定就会成为可回收对象。
  • 被判定为不可达的对象要成为回收对象,要至少经历两次标记过程。
  • 如果在这两次标记过程中仍然没有逃脱成为可回收对象的可能性,则基本上就真的成为可回收对象了。

通过一系列称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索走过的路径称为“引用链”,当一个对象到 GC Roots 没有任何的引用链相连时(从 GC Roots 到这个对象不可达)时,证明此对象不可用。

在这里插入图片描述

(3)什么是GC Root

  • 指一些被JVM认为是存活的对象,它们是垃圾回收算法的起点

  • 可以理解为由堆外指向堆内的引用, 本身是没有存储位置,都是字节码加载运行过程中加入 JVM 中的一些普通引用

  • 通俗的例子可以是一个树形结构,树的根节点就是GC Roots

  • 是垃圾回收器的起点,如果一个节点没有任何子节点与根节点相连,那这个节点就被认为是不可达的,可以被回收器回收

  • 通俗的例子

    • 将GC Roots比喻成一座城市,城市中有很多建筑物,这些建筑物就是内存中的对象
    • GC Roots就像城市的卫生局、消防局等,它们直接或间接地与城市中的建筑物相连
    • 从这些机构出发,通过道路、桥梁等连接,最终能够到达所有的建筑物
    • 如果一个建筑物没有与这些机构相连,那么它就被认为是废弃的,可以被清理掉

(4)JVM中的GCRoots对象有哪几种

  • 虚拟机栈(栈帧中的本地变量表)中引用的对象。

  • 方法区中类静态属性引用的对象

    • JDK 1.7 开始静态变量的存储从方法区移动到堆中
    • 比如你定义了一个static 的集合对象,那里面添加的对象就是可以被GC Root可达的
  • 方法区中常量引用的对象

    • 字符串常量池从 JDK 1.7 开始由方法区移动到堆中
  • 本地方法栈中JNI(即一般说的Native方法)引用的对象。

在这里插入图片描述

(5)对象可回收,就一定会被回收吗?

  • 不一定会回收,对象的finalize方法给了对象一次最后一次的机会。
  • 当对象不可达(可回收)并发生 GC 时,会先判断对象是否执行了 finalize 方法,如果未执行则会先执行 finalize 方法
  • 将当前对象与 GC Roots 关联,执行 finalize 方法之后,GC 会再次判断对象是否可达
  • 如果不可达,则会被回收,如果可达,则不回收!
  • 需要注意的是 finalize 方法只会被执行一次,如果第一次执行 finalize 方法,对象变成了可达,则不会回收
  • 但如果对象再次被 GC,则会忽略 finalize 方法,对象会被直接回收掉!

未完待续。。。。。。,今个累累,改天再补上。

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

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

相关文章

20230501-win10-制作U盘启动盘-firpe

20230501-win10-制作U盘启动盘-firpe 一、软件环境 zh-cn_windows_10_consumer_editions_version_22h2_updated_march_2023_x64_dvd_1e27e10b.isofirpe 1.8.2标签:firpe win10分栏:WINDOWS 二、硬件环境 8G或以上的U盘一个FX86笔记本一台 三、官方下…

2。硬件基础知识

介绍嵌入式软件开发所需要了解的硬件基础知识,与软件相结合学习 一 电阻 阻值:直标法,或色标法(碳膜电阻上的横线) 类型:线性,非线性(压敏电阻、热敏电阻) 基本参数&a…

HQL - 查询首次下单后第二天连续下单的用户比率

水善利万物而不争,处众人之所恶,故几于道💦 题目: 从订单信息表(order_info)中查询首次下单后第二天仍然下单的用户占所有下单用户的比例,结果保留一位小数,使用百分数显示, 解题: …

STL常用梳理——STRING

容器——string篇 STL简介String常见接口函数深度了解String构造函数拷贝构造赋值重载析构函数运算符重载查找 STL简介 STL(Standard Template Library,标准模板库),是惠普实验室开发的一系列软件的统 称。现在主要出现在 c中,但是在引入 c之前该技术已…

Day959.架构现代化模式 -遗留系统现代化实战

架构现代化的新城区模式 Hi,我是阿昌,今天学习记录的是关于架构现代化的新城区模式的内容。 前面的四个现代化并不是层层递进的关系,而是既可以同时进行,也可以颠倒顺序。 比如,既可以先重构代码,再拆分…

在外远程NAS群晖Drive - 群晖Drive挂载电脑磁盘同步备份【无需公网IP】

文章目录 前言1.群晖Synology Drive套件的安装1.1 安装Synology Drive套件1.2 设置Synology Drive套件1.3 局域网内电脑测试和使用 2.使用cpolar远程访问内网Synology Drive2.1 Cpolar云端设置2.2 Cpolar本地设置2.3 测试和使用 3. 结语 转发自CSDN远程穿透的文章:【…

DAY07_常用API下

1:String 1.1 String(构造方法) String类,它涉及到两个案例:用户登录和聊天室。 先来看用户登录案例:需要输入用户名和密码,和已知的用户名和密码进行比较,涉及到比较的方法, 一般来说&…

【Springboot+Vue+MP+ElementUI+axios项目实战记录】

写在最前:仅用于记录项目中遇到的问题,并不一定解决 1、 想要实现,点击配置自动跳转页面 2、 虽然使用了push追加了url,但是在跳转下一个,比如 配置跳转到用户会因为之前的url是http://localhost:8080/admin/pagetw…

【SpringBoot】MyBatisPlus代码生成器

项目准备 数据库 MySql 5.7 新建数据库votedb,新建两个测试表user、vote_theme user表 vote_theme表 建表代码如下 -- ---------------------------- -- Table structure for user -- ---------------------------- DROP TABLE IF EXISTS user; CREATE TABLE…

muduo 网络库数据流分析

最近自己实现了一个 Tiny_WebServer 服务器,是一个半同步半反应堆的模式,具体可以看我 github 上面的描述。但是春招实习二面被面试官表示项目太简单了,疯狂被怼分布式、集群等知识,故想进一步重构项目,无奈我实现的 T…

Anaconda Prompt安装pytorch

详解Anaconda安装pytorch的全过程 1.首先切换Anaconda的镜像地址,切换的原因我想大家应该明白😊 在anaconda prompt中输入以下四行命令 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/conda config --add ch…

医学图像分割之Attention U-Net

目录 一、背景 二、问题 三、解决问题 四、Attention U-Net网络结构 简单总结Attention U-Net的操作:增强目标区域的特征值,抑制背景区域的目标值。抑制也就是设为了0。 一、背景 为了捕获到足够大的、可接受的范围和语义上下文信息,在标…

Anaconda安装教程

最新Anaconda3安装教程 1.Anaconda3下载 官网下载地址 缺点: 下载速度比较慢,对速度有要求的小伙伴往下看 通过清华镜像加速的方式下载比较快 清华镜像加速地址 2.Anaconda3安装 双击安装包,点击next 点击 I agree 选择使用的用户&am…

攻防世界-Crypto-不仅仅是Morse

题目描述:题目太长就不拷贝了,总之,就是对以下字符进行解密 --/.-/-.--/..--.-/-..././..--.-/..../.-/...-/./..--.-/.-/-./---/-/...././.-./..--.-/-.././-.-./---/-.././..../..../..../..../.-/.-/.-/.-/.-/-.../.-/.-/-.../-.../-.../…

QML应用动画(Applying Animations)

目录 一 扩展可点击图像元素版本2(ClickableImage Version2) 1 第一个火箭 2 第二个火箭 3 第三个火箭 动画可以通过以下几种方式来应用: 属性动画 - 在元素完整加载后自动运行; 属性动作 - 当属性值改变时自动运行&#xf…

通讯录的实现(静态入手版)

🍉博客主页:阿博历练记 📖文章专栏:c语言(初阶与进阶) 🎁代码仓库:阿博编程日记 🌹欢迎关注:欢迎友友们点赞收藏关注哦 文章目录 🍭前言&#x1f…

python学习之【类和对象】

前言 五一快乐! 上一篇文章python学习——【第八弹】中,给大家介绍了python中的函数,这篇文章接着学习python中的类和对象。 我们知道,python中一切皆对象。在这篇文章开始之前,我们先了解一下编程界的两大阵营——面…

[渗透教程]-004-长城防火墙GFW的原理

文章目录 1. baidu.com 请求过程2. GFW原理2.1 GFW拦截方法1:DNS渲染2.2 通过IP黑名单2.3 VPN阻断1. baidu.com 请求过程 家庭的路由器具备了交换机的功能.域名–>ip,优先检测本地的缓存,没有的话就查找DNS服务器,传输层对应该层的数据进行封装增加了端口的信息,网络层对传输…

[230502]英语阅读长难句分析|共6个

🍣五月份第二篇笔记🍣 40:0/3 41: 3/3 目录 题目 40-1 (1)句子结构分析 (2)生词 (3)原题 40-2 (1)句子结构分析 (2&#…

2022年度项目管理软件排名揭晓:哪些软件在市场中脱颖而出?

在项目管理软件的选择过程中,用户会倾向于参考一些软件排名来辅助自己进行选择。软件排名方面推荐参考G2,一个国外的靠谱软件评测网站,类似于软件版的“大众点评”,软件评价来自于真实用户,网站通过多维度的算法&#…