JVM(垃圾回收机制 ---- GC)

啥是垃圾?

不再使用的内存


啥是垃圾回收机制?

自动释放不用的内存

注意: GC 主要是针对 堆 进行的
GC的基本操作单位是 对象, 即GC’回收的是整个对象都不使用的情况


GC 的优缺点

好处: 省心, 写代码简单, 不易出错
缺点: 需要消耗额外资源, 有额外性能开销 , 此外, 易触发 STW 问题

STW 问题

Stop The World
如果内存中垃圾很多, 此时触发一次 GC 操作, 开销可能非常大, 还可能会触发一些锁操作, 因此会导致业务代码无法正常执行


GC 实际工作过程

  1. 找到垃圾 / 判定垃圾
  2. 进行垃圾 (对象) 的释放

找到垃圾 / 判定垃圾

关键是看这个有没有引用 “指向” 它, 没有引用指向的对象, 自然不可能被用到, 就是垃圾了

两种典型实现:

  1. 引用计数 (py / php 做法)
    给每个对象分配一个计数器, 每次创建一个引用指向该对象, 计数器加一, 每次删除一个该对象的引用, 计数器减一, 当计数器为0, 该对象自然就是垃圾了

问题 :

  • 内存空间利用率低 (计数器本身需要存储)
  • 存在循环引用的问题 (py / php 使用引用计数, 需要搭配其他机制来避免循环引用)
  1. 可达性分析 (Java 做法)
    将整个 Java 中所有的对象, 通过 链式 / 树形 结构, 整体给串起来
    可达性分析,就是把所有的对象被组织起来的结构视为树, 从树的根节点出发, 遍历树, 所有能被访问到的对象, 标记成 “可达”
    JVM 再比对自己手里的对象名单, 将不可达的对象进行回收(每次 new 一个对象的时候, JVM 都会有记录)
  • 可达性分析类似树遍历, 相对于引用计数会慢一些 (因此不必一直执行, 每隔一段时间执行一次就ok ---- “虽迟但到” )
  • 可达性分析遍历的起点 ---- GCroots (一个代码中会有很多起点, 每个起点往下扫一遍, 就完成一次分析)

清理垃圾 (此处为几种垃圾回收算法)

  1. 标记清理
    在这里插入图片描述
    简单粗暴的做法, 如果灰色区域为垃圾, 白色不是, 则直接清除
    清理完后的内存空间示意图
    问题:
  • 会产生零散的内存碎片

2.复制算法
在这里插入图片描述
把内存空间均分成两份, 每次将不是垃圾的对象复制到另外一边, 然后把整个含垃圾的区域清理掉
问题 :

  • 空间利用率低 (每次只能用到一半空间)
  • 如果垃圾少, 有效对象多, 复制成本就会很大
  1. 整理标记
    在这里插入图片描述
    类似顺序表删除中间元素, 将不是垃圾的对象从前往后依次排开, 清理剩余空间
  • 保证了空间利用率, 也解决了内存碎片问题
  • 显而易见, 本做法效率也不高

分代回收
基于上述基本策略, 搞了一个符合策略 “分代回收”
历史基本规律: 如果一个东西存在的时间比较长, 那么大概率还会继续长时间存在下去
该规律对于 Java 同样有效, Java 对象要么生命周期特别长, 要么特别短
引入概念: 年龄 ---- 熬过 GC 的轮次 (没被清理)

将堆分成一系列区域
Minor GC : 新生代 GC
Full GC : 老年代 GC
在这里插入图片描述

  • 刚创建的对象, 年龄为 0 ,放到伊甸区
  • 熬过一轮 GC ,放入幸存区 (复制算法)
  • 幸存区中对象, 周期性接收 GC 考验, 如果变成垃圾, 就被释放, 如果不是垃圾, 就拷贝到另外一个幸存区 (俩幸存区同一时刻只使用一个), 在二者间来回拷贝 (复制算法)
  • 在幸存区中经过了多轮考验后, 进入老年代
  • 老年代也要周期性 GC 扫描, 只是频率更低
  • 如果老年代的对象是垃圾了, 使用标记整理的方式进行释放

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue 内容渲染和属性绑定

内容渲染指令 1. 使用v-text指令&#xff0c;将数据采用纯文本方式填充其空元素中 <script setup>import { reactive } from vuelet student reactive({name: Jack,desc: <h3>我是来自中国的小朋友&#xff01;</h3>}) </script> <template><…

介绍下RabbitMQ的事务机制

想要保证发送者一定能把消息发送给RabbitMQ&#xff0c;一种是通过confirm机制&#xff0c;另外一种就是通过事务机制。 RabbitMQ的事务机制&#xff0c;允许生产者将一组操作打包一个原子事务单元&#xff0c;那么全部执行成功&#xff0c;要么全部失败。事务提供了一种确保消…

【开源】JAVA+Vue.js实现食品生产管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 加工厂管理模块2.2 客户管理模块2.3 食品管理模块2.4 生产销售订单管理模块2.5 系统管理模块2.6 其他管理模块 三、系统展示四、核心代码4.1 查询食品4.2 查询加工厂4.3 新增生产订单4.4 新增销售订单4.5 查询客户 五、…

操作系统:初识操作系统

目录 1.冯诺依曼体系结构 2.操作系统 2.1什么是操作系统 2.2为什么需要操作系统 2.3怎么实现操作系统 1.冯诺依曼体系结构 对于上图&#xff1a; 输入设备完成的是写入工作&#xff0c;输出设备完成输出工作&#xff0c;这两部分包含磁盘这类的外存。 存储器一般指的是内存…

【C#杂谈】在 .NET Framework 中使用新的C#语言特性

前排提示&#xff1a;提出一个可以让 [^1] 这中语法可以在.NET Framework运行时中使用的方法 众所都周知&#xff0c;.NET Framework&#xff08;以下简称 .NF&#xff09;作为一个被微软官方确认不在继续发布新特性的运行时&#xff0c;它所对应的C#语言版本被&#xff08;官方…

TruEra

文章目录 关于 TruEra关于 TruLens 关于 TruEra TruEra Gen AI Observability and LLM Evaluation​ Monitor, evaluate, and debug your LLM and Gen AI apps. All part of Full Lifecycle AI Observability from TruEra. 官网&#xff1a;https://truera.comgithub : https…

时间序列分析技巧(一):根据ACF、PACF进行AR、MA、ARMA模型选择

程序员如何选择职业赛道&#xff1f; &#x1f349;CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一&#xff5c;统计学&#xff5c;干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项&#…

定时执行专家 - 自动截屏任务的设置步骤

以下是使用定时执行专家进行自动截屏的设置步骤&#xff1a; 下载并安装定时执行专家 从以下 官方博客 下载最新版本的定时执行专家&#xff0c;并按照提示进行安装。 BoomWorks软件的最新版-CSDN博客文章浏览阅读10w次&#xff0c;点赞9次&#xff0c;收藏42次。▉定时执行…

C语言数据结构与算法——深度、广度优先搜索(DFS、BFS)

目录 一、深度优先搜索&#xff08;Depth-First-Search 简称&#xff1a;DFS&#xff09; 无向图的深度优先搜索 有向图的深度优先搜索 二、广度优先搜索&#xff08;Breadth-First-Search 简称&#xff1a;BFS&#xff09; 无向图的广度优先搜索 有向图的广度优先搜索 深…

市场复盘总结 20240305

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 二进三&#xff1a; 进级率中 25% 最常用的…

CSS字体样式值,html注释标签

突破困境&#xff1a; 1. 提升学历 前端找工作&#xff0c;学历重要吗&#xff1f; 重要。谁要是告诉你不重要那一定是在骗你。现实情况是大专吃紧&#xff0c;本科够用&#xff0c;硕士占优&#xff0c;大专以下找到工作靠运气和真实力。 学历是硬伤&#xff0c;已经毕业的你…

(黑马出品_02)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

&#xff08;黑马出品_02&#xff09;SpringCloudRabbitMQDockerRedis搜索分布式 微服务技术栈治理 今日目标1.Nacos配置管理1.1.统一配置管理1.1.1.在nacos中添加配置文件1.1.2.从微服务拉取配置 1.2.配置热更新1.2.1.方式一1.2.2.方式二 1.3.配…

【Java设计模式】六、代理模式:静态代理、JDK + CGLIB动态代理

文章目录 1、代理对象2、代理模式结构3、静态代理4、JDK动态代理5、JDK动态代理的原理6、CGLIB动态代理7、三种代理的对比8、代理模式的总结 结构型设计是将类或者对象按某种布局&#xff08;继承机制、组合聚合&#xff09;来组成更大结构。包括七种&#xff1a; * 代理模式 …

代码随想录第51天|● 309.最佳买卖股票时机含冷冻期 ● 714.买卖股票的最佳时机含手续费 ●总结

文章目录 ● 309.最佳买卖股票时机含冷冻期思路代码 ● 714.买卖股票的最佳时机含手续费思路&#xff1a; ●总结 ● 309.最佳买卖股票时机含冷冻期 思路 代码 class Solution {public int maxProfit(int[] prices) {// 0.买入状态-(持有)// 1.保持卖出股票的状态// 2.今天…

JVM运行时数据区——堆

文章目录 1、堆的核心概述1.1、JVM实例与堆内存的对应关系1.2、堆与栈的关系1.3、JVM堆空间划分 2、设置堆内存大小与内存溢出2.1、设置堆内存大小2.2、内存溢出案例 3、新生代与老年代4、图解对象分配过程5、Minor GC、Major GC、Full GC5.1、GC的分类5.2、分代式GC策略的触发…

Sora:AI视频模型的无限可能与挑战

随着人工智能技术的突飞猛进&#xff0c;AI视频模型已成为科技领域的新焦点。OpenAI推出的AI视频模型Sora&#xff0c;凭借其卓越的技术性能和前瞻性&#xff0c;为AI视频领域的发展揭开了新的篇章。本文将从技术解析、应用场景、未来展望、伦理与创意以及用户体验与互动五个方…

【python基础学习09课_装饰器、模块、文件】

一、项目的日志 1、日志意义与级别 1、日志的意义&#xff1a;项目的日志 -- 开发编写的&#xff0c;日志记录 -- 测试就是去查看日志信息&#xff08;为了协助我们进行问题的定位&#xff09; 可以根据日志&#xff0c;看是哪个应用的哪台机器&#xff0c;出现了什么问题&…

Scala 之舞:林浩然与杨凌芸的 IDEA 冒险

Scala 之舞&#xff1a;林浩然与杨凌芸的 IDEA 冒险 The Dance of Scala: The IDEA Adventure of Lin Haoran and Yang Lingyun 在那个阳光明媚的日子里&#xff0c;林浩然如同一位英勇的探险家&#xff0c;踏入了 Scala 的 IntelliJ IDEA 开发环境的奇妙领域&#xff0c;他带着…

day7 字符数组

1&#xff1a;输入一个字符串&#xff0c;实现单词逆置 输入:"good good study" 输出&#xff1a;"study good good" 6 //单词逆置7 // good good study8 // study good good9 10 //整体逆置11 char str[50]"good good stu…

springboot集成logback打印彩色日志

一、logback介绍 Logback是由log4j创始人设计的另一个开源日志组件,官方网站&#xff1a; logback.qos.ch。它当前分为以下三个模块&#xff1a; logback-core&#xff1a;其它两个模块的基础模块。logback-classic&#xff1a;它是log4j的一个改良版本&#xff0c;同时它完整实…