【JVM】JVM 垃圾回收算法

news2024/11/16 17:41:11

文章目录

  • 前言
  • 标记清除(Mark-Sweep)
      • 介绍
      • 优缺点
  • 复制(拷贝 Copying)
      • 介绍
      • 优缺点
  • 标记整理(Mark-Compact)
      • 介绍
      • 优缺点

前言

目前JVM中有三种常见的垃圾回收算法,分别是:标记清除、标记整理和复制,这三种垃圾回收算法各有优缺点,下面逐一介绍。
在读本篇文章中,如果对JVM中哪个是垃圾,哪个不是垃圾,JVM到底是怎么知道的,请先读下面这篇文章

【JVM】JVM 判断对象存活算法(引用计数算法与根可达性分析算法)


标记清除(Mark-Sweep)

介绍

标记清除算法主要分成两个阶段,就跟算法的名字一样,标记和清除,标记阶段是发现哪些对象是个垃圾后,打上标记,等到都标记完成后,就是清除阶段,清除阶段就是把该对象清掉。

下面是一个示例图,上面的图代表清理前的时候,内存中的对象分布情况,下面的图代表经过标记清除算法后,内存中的对象分布情况:

在这里插入图片描述

优缺点

优点:效率高。
缺点:可用内存太分散,称之为内存碎片化,如果这时候来一个大的对象,需要占到连续的内存区域,就会出现找不到可用的连续内存区域的情况。


复制(拷贝 Copying)

介绍

复制算法的思路是将内存区域一分为二,分别为A区域和B区域(注:这里的A区域和B区域只是方便理解),新产生的对象会丢在A区域内,当A区域满了以后,就会把A区域内的存活对象都移到B区域内,并在B区域内把存活对象排列好,然后A区域整体清理回收;那么如果B区域满了以后呢,就会把B区域内的存活对象移到A区域内,在A区域内把存活对象排列好,然后把B区域整体清理回收,循环往复,下面是示例图:
在这里插入图片描述

优缺点

优点:效率高,并且把内存空间整理了。
缺点:浪费内存,只能用内存的一半。


标记整理(Mark-Compact)

介绍

标记整理算法与标记清除算法很像,标记整理算法可分为三个阶段,前面两个阶段与标记清除算法本身一样,标记阶段是发现哪些对象是个垃圾后,打上标记,等到都标记完成后,就是清除阶段,清除阶段就是把该对象清掉,剩下就到了整理阶段,整理阶段是将剩余的存活对象重新在内存区域内排列,这样做就会避免内存碎片化,下面是示例图。

在这里插入图片描述

优缺点

优点:清除垃圾对象后把内存排列好了。
缺点:效率低,是这三种算法中效率最低的,。





End


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

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

相关文章

Matter实战系列-----1.软硬件开发环境搭建

一、硬件方面 我使用的是一套xG21 BRD4180B和两块xG24 BRD4187C,如下图: 1.1 RCP: 芯片型号EFR32MG21A020F1024IM32 1.2 Matter Light/Switch over Thread: 芯片型号EFR32MG24B220F1536IM48 1.3 蓝牙5.0 USB dongle 注意由于Linux对蓝牙…

阿里、字节、网易面试必考,黑马【爆火】微服务项目发布

最近,收到一位粉丝投稿,他说:“阿里三面凉凉了,输在了微服务上。” 在看到微服务的面试题后,整个人都是懵的,发现没有经验的自己,一窍不通。 如今,微服务已经成为Java开发者必备的…

深入篇【C++】string类的常用接口介绍:标准库中的string类 【万字总结】

深入篇【C】string类的常用接口介绍:标准库中的string类 Ⅰ.string类介绍Ⅱ.string类的常用接口①.string类对象的常用构造1.string()2.string(const char*ch)3.string(const string& str)4.string(size_t n,char c)5.string(const string& str,size_t pos,…

想开发测试工具,应该如何入手?

何为测试工具?就是能辅助测试同学来完成特定的操作的工具,比如常见的如postman、Fiddler、Charles、jira,包括jmeter等,当然还包括公司自己开发的用例转换工具,造数工具,Mock工具或是平台等等。一般以应用程…

测试在“鸡头”和“凤尾”间如何选择?

经常在知乎上碰到这样的问题:同时拿到多个offer,公司有大有小,有创业型有成熟性,怎么在“鸡头”和“凤尾”间做选择? 为什么会纠结呢?通常创业型公司,给优秀的测试员的薪酬远高于市场平均值&…

“我只想找个测试岗,你却百般刁难我!”给我们带来的思考

最近看到一篇帖子,讲的是一个七八年的大龄测试员被公司补偿性裁员后,找工作的糟心经历。 原文是酱紫的: ---------------------------------------- 不管怎么说,我做测试也有七八年了,一直觉得自己的技术还是可以的&…

MongoDB实际场景应用

你要构建一个在线零售商店,这个店铺需要处理会员数据、订单数据以及商品数据等。为了保存和管理这些数据,你可以使用MongoDB。 目录 1. 设计数据模式 2. 插入数据 3. 查询数据 1. 设计数据模式 对于在线零售商店的数据,你可以设计三个Mo…

3年经验,面试测试岗20k都拿不到了吗?

我的情况 大概介绍一下个人情况,女,本科,三年多测试工作经验,懂python,会写脚本,会selenium,会性能,然而到今天都没有收到一份offer!从年后就开始准备简历,年…

C#基于云计算SaaS模式的医学检验云LIS系统全套源码

一、云LIS系统概述: 云LIS系统是一种基于云计算技术的实验室信息管理系统,它的主要功能是管理实验室中的各种信息数据,包括样品数据、检测结果、仪器设备管理、质控管理等。 二、与传统的LIS系统相比,云LIS系统具有以下优势&…

考完PMP后,还有必要考NPDP吗?

PMP证书目前在国内有很高的知名度,报考人数也在逐年上升,可以说,几乎所有的项目经理都有过考PMP的计划。 但随着PMP的持证人数越来越多,不少考完PMP的项目经理,开始考虑要不要报名NPDP考试。 那么考完PMP后有必要考N…

软件测试项目拿到不知道从哪里下手?今天我手把手教你

1.登录页面 2.首页 3.项目管理 4.测试环境 1>设置headers;可以每个url设置共同的header,可以存在变量;执行时,指定接口补全header; 5.接口管理 swagger导入功能;根据指定的测试环境url,导入s…

基于javaweb jsp+SSM 网红书店图书借阅系统的设计与实现

一.项目介绍 本系统分为管理员和读者两类 管理员:维护管理员账号和读者账号信息、维护书籍分类信息、维护书籍信息、维护书籍借阅信息、维护书籍预约信息、邮件管理、书籍阅读量统计、系统管理 读者:书籍借阅、书籍预约、预约邮件管理以及个人信息 …

Kubernetes的kubectl命令补全

Kubernetes的kubectl命令补全 环境准备 首先我们需要安装一个kubernetes的集群,可以参考我写的教程: 文档教程:https://blog.csdn.net/m0_51510236/article/details/130842122视频教程:https://space.bilibili.com/34615738341…

【springboot 实践】断点续传这么搞--附代码

目录 背景开搞RandomAccessFileAPI 代码文件分块断点续传、文件秒传分块上传、文件合并 总结 今天给大家分享的又是一篇实战文章,也是最近私活里遇到的,万能的互联网给了我办法,分享一下。 背景 最近接到一个新的需求,需要上传2…

chatgpt赋能python:Python中如何居中输入文字

Python中如何居中输入文字 Python是一种流行的编程语言,因其易学易用而闻名。尽管Python的主要用途是开发程序,但是有时需要在输出中使用美观的文本格式。本文将详细介绍如何在Python中居中输入文字。 什么是文本居中? 文本居中是指将文本…

35 # 模块的断点调试 require 语法实现过程

虚拟机模块:可以创建沙箱环境 const k 100;const vm require("vm"); vm.runInThisContext("console.log(a)");node 中如何实现代码的调试 node 调试指南 1. 可以在浏览器中进行调试(比如调试 webpack 等模块可以使用&#xff0…

Arrays.asList()得到的是真的ArrayList?操作修改集合大坑

一、前言 今天在看阿里Java规范的时候看到一条规范,经常使用,却一直没有注意的一条! 相信大家应该踩过这个坑,下面来看一看阿里规范里的内容: 【强制】使用工具类 Arrays.asList() 把数组转换成集合时,不…

SpringBoot——SpringBoot服务启动过程源码详解剖析!

文章目录 引言主要流程启动类剖析启动类示例SpringApplication.run()方法 创建SpringApplication对象过程创建对象源码流程整体分析不服就debug 创建对象核心过程分解流程1:deduceFromClasspath()获取主程序类和应用类型流程2: setInitializers()设置初始…

人工智能的崛起:将导致大量工人流离失所

人工智能(AI)正在迅猛发展,并且已经开始改变世界。过去5到10年间,AI取得了巨大的进步,在某些领域甚至达到了人类水平,例如语音识别。AI的应用范围越来越广泛,其影响已经渗透到社会的方方面面。 …

DataSecurity Plus:强大的企业数据安全解决方案

企业数据安全是当今数字化时代中至关重要的一个议题。随着企业数字化转型的加速和数据泄露事件的频繁发生,保护和管理企业数据变得愈发关键。在这个背景下,DataSecurity Plus作为一款领先的数据安全解决方案,为企业提供了强大的保护机制和全面…