了解垃圾回收算法

点击下方关注我,然后右上角点击...“设为星标”,就能第一时间收到更新推送啦~~~

垃圾回收(Garbage Collect)是Java语言中的一种自动内存管理机制,用于自动回收不再使用的对象所占用的内存空间。Java虚拟机会自动追踪和识别不再使用的对象,并将其回收,以释放内存资源。垃圾回收的主要目的是自动管理内存,以避免内存泄漏和内存溢出等问题。

1

 Java中的垃圾回收机制

0e354f2d29c307871babfee7b44a6ba3.png

Java中的垃圾回收机制通过以下步骤进行:

标记(Mark):标记所有被引用的对象,标记结束后,未被标记的对象将被视为垃圾。

清扫(Sweep):回收垃圾对象,将垃圾对象从内存中清除。

整理(Compact):移动活对象,将活对象从原地移到新的位置,以便后续的存储。

再次标记(Mark):经过移动后,重新标记所有活对象,确保它们的引用关系正确。

再次清扫(Sweep):再次清理未被标记的对象。

Java中的垃圾回收器是并发执行的工作线程,它们在后台运行,并自动触发。

通过标记过程来确定一个对象是垃圾标记所有被引用的对象,标记结束后,未被标记的对象将被视为垃圾。只要在标记阶段被标记的对象,在后续的程序执行过程中就不会被修改,那么它们就是垃圾,等待回收。标记主要有 2 种方法。

1、引用计数法

在对象中设置一个引用计数器,每当有一个地方引用它时,计数器值就加 1,引用失效时就减 1。对于一个对象而言,任何时刻计数器为 0 的对象就是不可能再被使用的,就说明该对象是垃圾。如果两个对象相互持有引用,也就是两个对象的计数器都不为 0 ,就无法通知GC收集器回收它们,这两个对象就永远不能被回收。因此在 JVM 中一般不会用它来判断对象是否存活。

2、可达性分析

通过一些 GC Roots 对象(类加载器、虚拟机栈的本地变量表、static 成员、常量引用、本地方法栈的变量、Thread等)开始向下搜索,当没有被 GC Roots 引用到的对象就可以进行回收,下图的 Object4 和  Object5 没有被GC Roots 引用,因此就可判断为可回收对象。

0208ff234feb80b31fcc47c242e2bb80.png

2

垃圾收集算法

6fdd4a25c07a23bacb43c808f6a35fd0.png

垃圾收集算法主要有 4 种。

1、复制算法(Copying)

将内存划分为两块相等的区域,每次只使用其中一块,当进行 GC 的时候,就将还存活的对象复制到另外一块上面,然后把已经使用过的内存空间一次性清空。比如 S0 和 S1。

2、标记-清理算法(Mark-Sweep)

标记:当进行 GC时,所有的对象都会被扫描一遍,找出内存中需要回收的对象,并且把它们标记出来,从而确定需要垃圾回收的对象。标记的过程就是利用可达性分析找到垃圾对象

清理:在标记完成之后统一清理掉被标记需要回收的对象,回收所有标记过的对象,释放出对应的内存空间。

标记清理算法的缺点:标记清理过程比较耗时,标记清理之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。

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

标记过程仍然与"标记-清理"算法一样,但是后续步骤不是直接对可回收对象进行清理,而是空间进行整理,整理的过程是让所有存活的对象都向一端移动,然后直接清理掉边界以外的内存。

4、分层算法

将内存分为多个层次,每个层次都有不同的存活对象比例,越上面的层次,存活对象比例越高。

3

堆中的垃圾收集算法使用

b4ebe3fafdebb37d14bfd078f70f57e4.png

在堆内存中主要是利用分代来使用不同的垃圾收集算法的,在 Young 区使用复制算法,因为绝大多数的对象在被分配之后生命周期比较短,在Young 区使用复制效率比较高。在 Old 区使用标记清除或者标记整理算法,因为 Old 区对象的生命周期比较长,对象存活时间比较长复制就没有意义了,标记以后再清理或者整理效果高。

后面将为大家介绍垃圾收集器。

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

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

相关文章

算法39:Excel 表列序号

一、需求 给你一个字符串 columnTitle ,表示 Excel 表格中的列名称。返回 该列名称对应的列序号 。 例如: A -> 1 B -> 2 C -> 3 … Z -> 26 AA -> 27 AB -> 28 … 示例 1: 输入: columnTitle “A” 输出: 1 示例 2&…

uC-OS2 V2.93 STM32L476 移植:系统启动篇

前言 前两篇已经 通过 STM32CubeMX 搭建了 NUCLEO-L476RG 的 STM32L476RG 的 裸机工程,下载了 uC-OS2 V2.93 的源码,并把 uC-OS2 的源文件加入 Keil MDK5 工程 本篇适配 uC-OS2 的 系统定时器(Systick)与 PendSV_Handler&#xf…

leetcode 763. 划分字母区间

2023.8.3 本题的关键是要确保同一字母需要在同一片段中,而这就需要关注到每个字母最后一次出现的位置。 思路:用一个哈希表保存每个字母(26个)最后一次出现的位置。然后从头遍历,不断更新最右边界,直到当前…

Java电子招投标采购系统源码-适合于招标代理、政府采购、企业采购、等业务的企业 tbms

​ 功能描述 1、门户管理:所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含:招标公告、非招标公告、系统通知、政策法规。 2、立项管理:企业用户可对需要采购的项目进行立项申请,并提交审批,查…

[数据分析与可视化] Python绘制数据地图4-MovingPandas入门指北

MovingPandas是一个基于Python和GeoPandas的开源地理时空数据处理库,用于处理移动物体的轨迹数据。它提供了一组强大的工具,可以轻松地加载、分析和可视化移动物体的轨迹。通过使用MovingPandas,用户可以轻松地处理和分析移动对象数据&#x…

[JAVA基础]自动拆装箱NPE问题

1.自动拆装箱场景 自动装箱 当把字面量转换成包装类的时候会自动装箱 比如: Integer a 1; Integer b 1; 自动拆箱 当你对包装类的对象进行运算(如加法、减法等)时,Java会自动进行拆箱操作。拆箱是将包装类型的对象转换为相应的基…

登月再进一步:Apollo自动驾驶的里程碑

前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 「推荐专栏」: ★java一站式服务 ★ ★前端炫酷代码分享 ★ ★ uniapp-从构建到提升★ ★ 从0到英雄,vue成神之路★ ★ 解决算法,一个专栏就够了★ ★ 架…

数据结构 | 递归

目录 一、何谓递归 1.1 计算一列数之和 1.2 递归三原则 1.3 将整数转换成任意进制的字符串 二、栈帧:实现递归 三、递归可视化 四、谢尔平斯基三角形 五、复杂的递归问题 六、动态规划 一、何谓递归 递归是解决问题的一种办法,它将问题不断地分…

Google Colab 部署 Stable Diffusion Webui

1. 下载 vae 访问: https://huggingface.co/stabilityai/sd-vae-ft-mse-original/blob/main/vae-ft-mse-840000-ema-pruned.ckpt 根据下图的红圈部分,点击下载。 将其上传至GoogleDrive根目录 点击新建后,然后点击上传文件。 2. 访问 colab 首先第一步…

数据结构——单链表

无头单向非循环链表的建立 前言——什么链表链表形象图链表分类 一、Single_linked_list.h头文件的建立二、Single_linked_list.c功能函数的定义Single_linked_list_test.c主函数的定义四、代码运行测试五、Single_linked_list完整代码演示:总结 前言——什么链表 链…

一条自由游动的鲸鱼

先看效果&#xff1a; 再看代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>鲸鱼</title><style>#canvas-container {width: 100%;height: 100vh;overflow: hidden;}&l…

HTML之表单标签

目录 表单标签 Form表单 定义&#xff1a; 基本语法结构&#xff1a; form属性&#xff1a; enctyoe属性 fieldeset标签 fieldeset属性 legend标签 label标签 优势 label属性 input标签 input属性 input标签中的type属性 text text输入框有以下配套属性 searc bu…

太魔幻了!计算机就业哀鸿遍野,而高考生疯狂涌向计算机专业

在张雪峰推荐的几大专业里&#xff0c;计算机专业是其中之一。近几年&#xff0c;计算机专业报考热度不减&#xff0c;但就业前景却令人堪忧&#xff0c;互联网裁员接二连三&#xff0c;许多码农找不到工作。 一位网友感叹&#xff1a;一边是计算机就业哀鸿遍野&#xff0c;一…

IDEA中怎么使用git下载项目到本地,通过URL克隆项目(gitee\github)

点击 新建>来自版本控制的项目 点击后会弹出这样一个窗口 通过URL拉取项目代码 打开你要下载的项目仓库 克隆>复制 gitee github也是一样的 返回IDEA 将刚刚复制的URL粘贴进去选择合适的位置点击克隆 下载完成

Mac电脑目录

System&#xff08;系统&#xff09;Applications&#xff08;应用程序&#xff09;应用程序目录&#xff0c;默认所有的GUI应用程序都安装在这里User&#xff08;用户&#xff09;存放用户的个人资料和配置。每个用户有自己的单独目录Library&#xff08;资料库&#xff09;系…

Android的Handler消息通信详解

目录 背景 1. Handler基本使用 2. Handler的Looper源码分析 3. Handler的Message以及消息池、MessageQueue 4. Handler的Native实现 4.1 MessageQueue 4.2 Native结构体和类 4.2.1 Message结构体 4.2.2 消息处理类 4.2.3 回调类 4.2.5 ALooper类 5. 总结&…

基于fpga_EP4CE6F17C8_秒表计数器

文章目录 前言实验手册一、实验目的二、实验原理1&#xff0e;理论原理2&#xff0e;硬件原理 三、系统架构设计四、模块说明1&#xff0e;模块端口信号列表dig_driver(数码管驱动模块)key(按键消抖模块)top(顶层模块) 2&#xff0e;状态转移图3&#xff0e;时序图五、仿真波形…

目标检测与跟踪 (2)- YOLO V8配置与测试

系列文章目录 第一章 目标检测与跟踪 &#xff08;1&#xff09;- 机器人视觉与YOLO V8 目标检测与跟踪 &#xff08;1&#xff09;- 机器人视觉与YOLO V8_Techblog of HaoWANG的博客-CSDN博客3D物体实时检测、三维目标识别、6D位姿估计一直是机器人视觉领域的核心研究课题&a…

7.物联网操作系统互斥信号量

1.使用互斥信号量解决信号量导致的优先级反转&#xff0c; 2.使用递归互斥信号量解决互斥信号量导致的死锁。 3.高优先级主函数中多次使用同一信号量的使用&#xff0c;使用递归互斥信号量&#xff0c;但要注意每个信号量的使用要对应一个释放 优先级翻转问题 优先级翻转功能需…

gateway过滤器没生效,特殊原因

看这边文章的前提&#xff0c;你要会gateway&#xff0c;知道过滤器怎么配置&#xff1f; 直接来看过滤器&#xff0c;局部过滤器 再来看配置 请求路径 http://127.0.0.1:8080/appframework/services/catalog/catalogSpecials.json?pageindex1&pagesize10&pkidd98…