JVM主要的几种垃圾回收算法

1、Java 为什么要实现自动内存管理 ?

简化开发过程:通过内存自动管理可以避免手动分配和释放内存的麻烦,减少了内存泄漏和内存错误的风险,让研发能更专注于业务逻辑,不必纠结于内存管理的细节。

提高开发效率:垃圾回收器(Garbage Collector)能够自动追踪不再使用的对象,并释放它们占用的内存。这消除了手动跟踪和释放对象的需要,减少了开发人员的工作量,提高了开发效率。

可移植性好:研发人员不需要关心不同平台的内存管理差异,这些细节都交由虚拟机和垃圾回收器进行处理,Java的内存管理机制使得Java程序在不同的平台上运行更加容易。

2、java 自动内存管理并不是一劳永逸

       Java的自动内存管理机制(垃圾回收器和垃圾回收算法的设计),确实可以大大简化开发人员对内存管理的工作,同样也带来了一系列的问题 

内存占用和性能问题:不合适的内存使用、配置,可能导致内存占用过高或性能下降。如,长生命周期对象、内存泄漏、过频繁的垃圾回收等,都会影响应用程序的性能和稳定性。

垃圾回收停顿:虽然垃圾回收器一直都在优化减少停顿时间,但并不能完全消除。实时性要求高的系统对停顿时间很敏感

所以我们需要搞懂JVM内存管理机制,才能针对不同的场景合理使用

3、垃圾回收的机制

a、垃圾回收发生在哪里 ?

       JVM 内存模型中程序计数器、栈、本地方法栈这 3 个区域是线程私有的,与线程同生共死,不涉及回收,所以垃圾回收的就在剩下的堆和方法区中了,堆中主要回收是对象方法区的回收则主要是废弃常量和无用的类

b、什么情况下对象可以被回收?

       JVM认为一个对象不再被引用,就代表该可以被回收了,目前有两种算法可以判断该对象是否可以被回收。

引用计数算法:通过对象的引用计数器判断对象是否被引用。即每当对象被引用时,该对象的引用计数器就会 + 1;  当引用失效时,计数器再 -1。对象引用计数器值为 0 时,表示该对象不再被引用,可以被回收。引用计数算法的实现简单,判断效率也很高,但它存在对象之间循环引用的问题

可达性分析算法:  在垃圾回收时,以 GC Roots 对象为根对象开始遍历对象图,确定哪些对象是可达的(即不会被回收),而哪些对象是不可达的(即可被回收)。目前 HotSpot 虚拟机采用的就是这种算法。

c、哪些是 GC Roots 对象 ?

虚拟机栈(栈帧中的本地变量表)中引用的对象:当前线程中方法调用链上的所有对象。

方法区中的类静态属性引用的对象:被类声明为静态变量的对象。

方法区中常量引用的对象:被常量池中的常量引用的对象。

本地方法栈中引用的对象:在Java代码中调用本地方法后,本地方法中引用的对象

       GC Roots 本身是不可被回收的,它们的存在保证了从根节点出发的对象的可达性。垃圾回收器通过追踪GC Roots对象的引用链,可以确定哪些对象是可达的,而哪些对象是不可达的,从而进行垃圾回收操作。

4、垃圾回收的三种方式

a、标记-清除算法(Mark and Sweep)

       把垃圾对象所占据的内存标记为空闲内存,并记录在一个空闲列表(free list)中。当需要新建对象时,内存管理模块便会从该空闲列表中寻找空闲内存,并划分给新建的对象。该回收方式的原理非常简单,但会带来俩个缺点

内存碎片化:由于 Java 虚 拟机的堆中对象必须是连续分布的,因此可能出现总空闲内存足够,但是无法分配的极端情

内存分配效率低:如果是一块连续的内存空间,那么我们可以通过指针加法 (pointer bumping)分配。但对于空闲列表,Java 虚拟机则需要逐个访问列表中的项,来查找能够满足新建对象的大小的空闲内存

b、标记-整理算法(Mark and Compact)

       在标记阶段(Mark)也会标记所有可达对象。然后,在整理阶段(Compact),将存活的对象压缩(Compact)到堆的一端,以释放不连续的内存空间。这种做法能够解决内存碎片化的问题,但代价是压缩算法的性能开销。

c、复制(copy)

       把内存区域分为两等分,分别用两个指针 from 和 to 来维 护,并且只是用 from 指针指向的内存区域来分配内存。当发生垃圾回收时,便把存活的对 象复制到 to 指针指向的内存区域中,并且交换 from 指针和 to 指针的内容。复制这种回收方式同样能够解决内存碎片化的问题,但是它的缺点也极其明显,即堆空间的使用效率极其低下。

d、分代回收算法(Generational)

        分代算法基于对象的生命周期将堆内存分为不同的代,如新生代和老年代。新生代中的对象通常具有较短的生命周期,而老年代中的对象具有较长的生命周期。不同代使用不同的垃圾回收算法,以便更好地适应对象的特性和内存使用模式。

G1的三种GC模式

young GC:当所有 eden region 被消耗无法再申请时触发一次young GC,活对象被拷贝到survivor region 或者晋升到 old region

mixed GC:回收整个young region,同时回收一部分old region。老年代占用达到一定阈值的时候触发

full GC:对象内存分配过快,mixed GC来不及回收,导致老年代被填满,会触发一次full GC

       JVM在应用垃圾回收器时往往会综合上述几种回收方式,综合它们优点的同时规避它们的缺点,达到比较优的内存管理方式

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

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

相关文章

2024年第九届机器学习技术国际会议(ICMLT 2024) 即将召开

2024年第九届机器学习技术国际会议(ICMLT 2024)将于2024年5月24-26日在挪威奥斯陆举行。ICMLT 2024旨在讨论机器学习技术领域的最新研究技术现状和前沿趋势,为来自世界各地的科学家、工程师、实业家、学者和其他专业人士提供一个互动和交流的…

cosmos及特定应用程序的区块链

特定应用程序的区块链,简单来说,一个区块链就是一个专门的应用程序。为了实现某一特定的去中心化应用而专门实现一个区块链。 传统的用智能合约构建去中心化应用不行吗? 灵活性不足:智能合约本质上受到虚拟机本身的限制。例如,以…

uniapp自定义封装只有时分秒的组件,时分秒范围选择

说实话&#xff0c;uniapp和uview的关于只有时分秒的组件实在是不行。全是日历&#xff0c;但是实际根本就不需要日历这玩意。百度了下&#xff0c;终于看到了一个只有时分秒的组件。原地址&#xff1a;原地址&#xff0c;如若侵犯请联系我删除 <template><view clas…

BlogPark测试报告

目录 一&#xff0c;项目背景 二&#xff0c;项目功能 三&#xff0c;测试计划 3.1 测试用例的设计 3.2 功能测试 1.正常登录 2.正常写博客测试 &#xff08;输入完整的标题和内容&#xff09; 3.发布博客之后跳转到详情页观察是否有刚发布的博客 4.删除博客观察列表的…

会计报名照片怎么压缩?这几种方法一定要会

会计师报名考试的时候&#xff0c;在上传证件照信息时通常会对图片大小、格式、尺寸、还有照片dpi分辨率以及照片背景颜色都有具体的要求&#xff0c;小编在这边建议考生提前了解好报名照片的要求&#xff0c;避免照片审核失败&#xff0c;那么会计报名照片怎么压缩呢&#xff…

基于springboot在线考试系统源码和论文

网络的广泛应用给生活带来了十分的便利。所以把在线考试管理与现在网络相结合&#xff0c;利用java技术建设在线考试系统&#xff0c;实现在线考试的信息化。则对于进一步提高在线考试管理发展&#xff0c;丰富在线考试管理经验能起到不少的促进作用。 在线考试系统能够通过互…

ISIS基本概率与配置(HCIP完整版)

目录 一、ISIS协议基础 1、ISIS概述&#xff08;认识ISIS&#xff09; 2、ISIS的应用 4、ISIS的工作过程 5、ISIS路由器的类型 6、ISIS区域 7、ISIS报文 8、ISIS基础配置 9、进程号&#xff1a; 10、NET地址 11、ISIS邻居关系 二、邻居表分析 1、ISIS邻居表字段解析…

MVC设计模式和与三层架构的关系

MVC设计模式和与三层架构的关系 MVC是一种设计模式&#xff0c;将软件按照模型、视图、控制器来划分&#xff1a; M&#xff1a;Model&#xff0c;模型层&#xff0c;指工程中的JavaBean&#xff0c;作用是处理数据 JavaBean分为两类&#xff1a; 一类称为数据承载Bean&#x…

JavaSec基础 反射修改Final修饰的属性及绕过高版本反射限制

反射重拾 半年没碰java了 先写点基础回忆一下 反射弹计算器 public class Test {public static void main(String[] args) throws Exception {Class<?> clazz Class.forName("java.lang.Runtime");clazz.getDeclaredMethod("exec", String.cla…

记录汇川:H5U与Fctory IO测试5

主程序&#xff1a; 子程序&#xff1a; IO映射 子程序&#xff1a; 自动程序 Fctory IO配置&#xff1a; 触摸屏如下&#xff1a; 实际动作如下&#xff1a; Fctory IO测试5

力扣:18.四数之和

一、做题链接&#xff1a;18. 四数之和 - 力扣&#xff08;LeetCode&#xff09; 二、题目分析 1.做这一道题之前本博主建议先看上一篇《三数之和》 2.题目分析 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重…

java连接池、C3P0、Druid德鲁伊连接池技术

java线程池 连接池C3P0Druid 连接池 概念&#xff1a;其实就是一个容器(集合)&#xff0c;存放数据库连接的容器。当系统初始化好后&#xff0c;容器被创建&#xff0c;容器中会申请一些连接对象&#xff0c;当用户来访问数据库时&#xff0c;从容器中获取连接对象&#xff0c…

信息论与编码期末复习——计算题+基础汇总(二)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…

微信小程序连接数据库与WXS的使用

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《微信小程序开发实战》。&#x1f3af;&#x1f3a…

基于Springboot+vue高校宿舍管理系统(前后端分离)

该项目完全免费 高校宿舍管理系统采用前后端分离的架构方式&#xff0c;是为学校宿舍管理打造的一套系统,可以让管理者更为便捷地处理学生公寓问题,从而大大提高管理效率,让学生公寓的资源合理分配,事半功倍,进而改善了学生公寓管理。 系统分为三种角色&#xff0c;分别是系统…

这些开源自动化测试框架,会用等于白嫖一个w

作者&#xff1a;黑马测试 链接&#xff1a;https://www.zhihu.com/question/19923336/answer/2585952461 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 随着计算机技术人员的大量增加&#xff0c;通过编写代码来…

【开源】基于JAVA+Vue+SpringBoot的大学计算机课程管理平台

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 实验课程档案模块2.2 实验资源模块2.3 学生实验模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 实验课程档案表3.2.2 实验资源表3.2.3 学生实验表 四、系统展示五、核心代码5.1 一键生成实验5.2 提交实验5.3 批阅实…

mysql进阶-视图

目录 1. 用途 2. 语法 2.1 创建或替换视图 2.2 修改视图 2.3 查看视图&#xff1a; 2.4 删除视图&#xff1a; 3. 其他 3.1 操作视图 3.2 迁移数据库 1. 用途 视图可以理解为一个复杂查询的简称&#xff0c;它可以帮助我们简化查询&#xff0c;主要用于报表查询:例如…

BigDecimal使用记录

在公司经费这块用到了BigDecimal类&#xff0c;特此整理记录一下。 一、BigDecimal简介&#xff1a; float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算&#xff0c;这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而&a…

Python接口自动化 —— 什么是接口测试、为什么要做接口测试(详解)

什么是接口测试 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。  一般来说&#xff0c;测试接…