【JVM篇】垃圾回收算法

news2024/11/25 23:50:53

目录

1、前言

2、标记-清除算法

3、标记-整理算法

4、标记-复制算法

5、总结


1、前言

说起垃圾回收(Garbage Collection)(本文简称GC)。相信同时对C++和Java有了解的小伙伴都知道,C++在new完对象后,是需要手动delete对象来释放内存的,而Java则不需要。虽然我们Java程序员不需要去手动的释放内存,但是了解JVM如何处理这一过程对我们来说也是很有必要的。

JVM对于垃圾回收这一篇幅其实是很长的,既然要对垃圾进行回收,那么不可避免的要思考三个问题:①哪些需要回收、②什么时候回收、③如何回收。

本文主要先讲解三个经典的垃圾回收算法,后面笔者会陆续更新其他的内容(比如什么是安全点,什么是安全区,经典垃圾回收器等)。

2、标记-清除算法

如上图所示,标记-清除算法就是每次进行垃圾回收时,标记出可以回收的对象,然后直接将这些对象回收(即释放对应区域的内存)即可。

标记-清除算法优点显而易见:那就是简单、高效(对于清除这一步骤来说)。因为我们只需要将标记出的对象直接清除便可,因此效率很高。

但是缺点相信学过操作系统的小伙伴肯定一眼就看出来了:久而久之会存在大量内存碎片,导致大对象无法分配到所需的内存空间。

3、标记-整理算法

如上图所示,标记-整理算法就是每次进行垃圾回收时,标记出可以回收的对象,然后将这些对象回收后,将存活的对象整理到连续的内存空间去。 

标记-整理算法实际上就是标记-清除算法的“改进版”,我们上述说到标记-清除算法的缺点就是会存在大量内存碎片,导致大对象无法分配到所需的内存空间。标记-整理算法在标记-清除算法的基础上,加了一个将存活对象移动到连续的内存空间这一步骤。

标记-整理算法的优点肯定大家也想到了——内存利用的更加充分,不会存在内存碎片,导致大对象分配不到所需的内存空间。

但是缺点想必大家也看出来了——回收时,每次都要将对象移动到一起,性能肯定会受到一定的影响。特别是当大部分对象都要回收时,只有少部分离散的对象存活,这个时候性能被影响的会更加明显。

4、标记-复制算法

如上图所示,标记-复制算法就是将内存区域分为两部分(这里我们称为回收区和保留区),垃圾回收时,我们每次标记出需要回收的对象,然后将不需要回收的对象复制到“保留区”后,将存活区的所有对象一起清除(因为我们在保留区保留了不需要回收的对象,所以回收区都可以回收了)。然后原回收区就空了,变成保留区,原保留区有对象,此时变成回收区。

标记-复制算法相对上述标记-整理算法来说,对于大部分对象都要回收时,只有少部分离散的对象存活这个场景来说,更加适用、高效,解决了这个场景下标记-整理算法的不足。

缺点也很明显,那就是我们每次都有一部分内存区域用不上(因为要拿一部分来当保留区)。

5、总结

本文只是比较快速的介绍了一下三个经典的垃圾回收算法,同时也说明了他们的优缺点。这里我们给大家一些总结:

  1. 对于追求垃圾回收延迟低(即垃圾回收这一过程快)的场景下,推荐使用“标记-清除算法”。
  2. 对于大部分对象都要回收时,只有少部分离散的对象存活这个场景下,我们推荐使用“标记-复制算法”。(在后面我们讲到分代思想时,新生代大部分都需要回收,因此是使用这个算法。)
  3. 对于少部分对象要回收,大部分对象都存活的场景下,我们推荐使用“标记-整理算法”(在后面我们讲到分代思想时,老年代大部分都不需要回收,因此是使用这个算法。)

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

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

相关文章

【Linux】发展史浅谈

为什么要学Linux? LInux和微软的Windows在定位上都是一样的,即操作系统。而且LInux是一款雄霸服务端的操作系统,是在企业端被高频使用的后台操作系统。 科技发展的基本模式 所有的技术进步,本质都是为了促进更好的工具的发明&a…

【Python ORM】零基础也能轻松掌握的学习路线与参考资料

Python orm(Object-Relational Mapping)是一种模式,它将对象和关系型数据库之间的映射相互转换,使得应用程序可以通过面向对象的方式来操作数据库。Python orm 在开发大型 Web 应用程序中特别有用,使得与数据库的交互变…

【IMX6ULL驱动开发学习】08.IMX6ULL通过GPIO子系统函数点亮LED

通过GPIO子系统函数点亮LED 1、GPIO子系统函数 1.1 确定 led 的GPIO标号,查看内核中的gpiochip 查看 gpiochip ,以正点原子的IMX6ULL阿尔法开发板为例 [root100ask:/sys/class/gpio]# cat /sys/kernel/debug/gpio 查看原理图,发现led接的引…

Linux虚拟网络设备---之使用Veth pair连接linux网桥bridge

本文目录 1、我们可以用以下命令来创建veth pair: veth0----veth12、创建五个命名空间namespaces后,可以用以下命令将veth设备对的一端移入namespaces命名空间,并开启veth2、将veth设备对的另外一端连接到linux网桥,并将所有namespaces命名空…

【Redis应用】UV统计(四)

🚗Redis应用学习第四站~ 🚩本文已收录至专栏:Redis技术学习 一.引入 首先我们要搞懂两个概念: UV:全称Unique Visitor,也叫独立访客量,是指通过互联网访问、浏览这个网页的自然人。1天内同一个…

【动态规划】斐波那契数列模型

冻龟算法系列之斐波那契数列模型 文章目录 【动态规划】斐波那契数列模型1. 第N个泰波那契数1.1 题目解析1.2 算法原理1.2.1 状态表示1.2.2 状态转移方程1.2.3 初始化1.2.4 填表顺序1.2.5 返回值 1.3 编写代码1.4 空间优化 2. 三步问题2.1 题目解析2.2 算法原理2.2.1 状态表示2…

解决Centos安装时找不到磁盘:未选择任何磁盘(no diks selected),本地标准磁盘为空

文章目录 问题描述问题原因解决办法 问题描述 笔者最近又买了一台新电脑,并打算在上面安装 Linux 来充当一个新的服务器结点。但很不幸的是,每次笔者略微尝试新事物时,都要踩很多坑。笔者在使用 U 盘刻录 CentOS 8 镜像之后,准备在…

公平锁/非公平锁/可重入锁/自旋锁

在JAVA中我们知道有很多加锁的方式,比如常见的 通过synchronized关键字,还有Lock,还有之前说原子CAS操作时有看到过的死循环方式的自旋锁。 借此来说一下锁的分类: 公平锁: 是指多个线程按照申请的顺序来获取锁,每次获取锁时会…

dp算法篇Day1

"多希望有人来陪我,度过末日啊~" 讲讲我为什么突然想更新这篇栏目。 想想自己也算 "系统" 接触计算机这个学科也有差不多一年了,回想起当初下定决心要全身心投入到这个专业或者说行业中来,现在到了这样的地步&#xff0c…

CSS基础学习--10 margin(外边距)

一、定义: CSS margin(外边距)属性定义元素周围的空间。 二、margin margin 清除周围的(外边框)元素区域。margin 没有背景颜色,是完全透明的。 margin 可以单独改变元素的上,下,左,右边距&a…

今天面了个35k字节跳动出来,真是砂纸擦屁股,给我露了一手...

​2023年春招已经结束,很多小伙伴收获不错,拿到了心仪的 offer。 各大论坛和社区里也看见不少小伙伴慷慨地分享了常见的面试题和八股文,为此咱这里也统一做一次大整理和大归类,这也算是划重点了。 俗话说得好,他山之石…

AI 绘画(0):导论

文章目录 导论感谢人员Ai绘画前期准备软件环境硬件条件 Ai绘画介绍Ai绘画简单流程介绍Ai绘画软件介绍参数输入介绍 Ai绘画公约 导论 Ai绘画是最近比较热门的绘画方式,以干掉原画师为口号,引起了激烈的讨论。Ai绘画能否取代人工我们先不谈,但…

一个专科生的 Python 转行之路

自学之路 正式开始学编程是在十月底的样子, 那时候在知乎 flask 话题下看到一个问题 「有多少人按萧井陌大神给出的PythonFlask路线找到工作了?」。就觉得自己也可以啊, 就开始辞职自学 Python,。 刚开始的那一个月确实能够做到每天 10 个小时写代码, 学了大概一个…

java设计模式之:外观模式

前言 举个现实生活中例子,泡茶和去茶馆喝茶的区别,如果是自己泡茶需要自行准备茶叶、茶具和开水,而去茶馆喝茶,最简单的方式就是跟茶馆服务员说想要一杯什么样的茶,是铁观音、碧螺春还是西湖龙井?正因为茶…

互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景

多线程访问共享资源的时候,避免不了资源竞争而导致数据错乱的问题,所以我们通常为了解决这一问题,都会在访问共享资源之前加锁。 最常用的就是互斥锁,当然还有很多种不同的锁,比如自旋锁、读写锁、乐观锁等&#xff0…

数据结构——树和二叉树

文章目录 **一 数的基本概念****1 定义****2 基本术语****3 树的性质** **二 二叉树的概念****1 二叉树的定义和特性****1.1 定义****1.2 特殊的二叉树****1.3 二叉树的性质** **2 二叉树的存储结构****2.1 顺序存储结构****2.2 链式存储结构** **三 二叉树的遍历和线索二叉树*…

Spark SQL数据源的基本操作(更新ing)

文章目录 一、基本操作二、默认数据源(一)默认数据源Parquet(二)案例演示读取Parquet文件1、在Spark Shell中演示练习1、将student.txt文件转换成student.parquet练习2、读取student.parquet文件得到学生数据帧,并显示…

K8S minikube本地安装

一. mac安装K8S 1.brew安装 brew install kubectl 2.查看版本 kubectl version --outputjson { "clientVersion": { "major": "1", "minor": "27", "gitVersion": "v1.27.2", &…

基于深度学习的高精度奶牛检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要:基于深度学习的高精度奶牛检测识别系统可用于日常生活中或野外来检测与定位奶牛目标,利用深度学习算法可实现图片、视频、摄像头等方式的奶牛目标检测识别,另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型…

locked勒索病毒利用零日漏洞,企业服务器数据瞬间遭受致命加密

目录 引言: 事件概述: .locked勒索病毒加密算法: 数据恢复建议: locked勒索病毒数据恢复案例: 什么叫零日漏洞? 对策建议: 引言: 近日,网络安全界再次爆发了一起…