了解垃圾回收算法

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

垃圾回收(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.hqwc.cn/news/52317.html

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

相关文章

【科普知识】了解电机T型速度曲线和S型速度曲线的区别!

当电机从静止状态启动并加速到额定转速时,其速度变化并非线性的,而是呈现出不同的曲线特征。T型速度曲线和S型速度曲线是两种典型的电机加速曲线类型。那它们之间有什么区别呢?今天,就让我们来深入探讨电机加速曲线的奥秘。 电机速…

2023值得关注的人工智能7大发展趋势

随着人工智能技术的不断创新和应用,我们可以看到人工智能在各个领域的应用越来越广泛。其中,有一些趋势特别值得我们关注。 1)深度学习技术的发展 深度学习技术在图像识别、语音识别、自然语言处理等领域表现出色,随着硬件计算能…

大模型系列|基于大模型复杂数据系统架构(二)

张俊林老师在 2023 WAIC AI 开发者论坛的演讲非常有概括性,这边沿着思路进行一定的整理。(文章来源:WAIC 2023 | 张俊林:大语言模型带来的交互方式变革) 文章目录 1 PlanningProgramming 模式的系统技术架构2 HuggingG…

把网站改为HTTPS访问方法

HTTPS是使用TSL/SSL加密超文本传输协议的扩展,用于跨网络的安全传输。网站更改为HTTPS,直接在网站形象上可以得到提升,更重要的是您的网站肯定会在排名和提升方面受益。机密信息的交换需要受到保护,以阻止未经授权的访问。 加密&a…

c语言指针的运算

1、通过指针计算数组的元素&#xff08;指针相减&#xff0c;类型需要一致&#xff09;&#xff0c;比如数组元素指针相减得到的是中间相差的元素个数&#xff0c;可以用于计算数组元素的个数等 #include "stdio.h" #include <stdlib.h>int main() {int a[10]…

《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(19)-Fiddler精选插件扩展安装,将你的Fiddler武装到牙齿

1.简介 Fiddler本身的功能其实也已经很强大了&#xff0c;但是Fiddler官方还有很多其他扩展插件功能&#xff0c;可以更好地辅助Fiddler去帮助用户去开发、测试和管理项目上的任务。Fiddler已有的功能已经够我们日常工作中使用了&#xff0c;为了更好的扩展Fiddler&#xff0c…

spring-cache框架使用笔记

spring-cache框架使用笔记 什么是spring-cache框架 spring-cache是spring框架中的一个缓存抽象层&#xff0c; 它提供了一种简便的方式来集成不同的底层缓存实现&#xff0c; 如内存缓存(concurrentMap/ehcache/caffeine)/分布式缓存(redis/couchbase)等 它简化了在app中使用…

go 如何知道一个对象是分配在栈上还是堆上?

如何判断变量是分配在栈&#xff08;stack&#xff09;上还是堆&#xff08;heap&#xff09;上&#xff1f; Go和C不同&#xff0c;Go局部变量会进行逃逸分析。如果变量离开作用域后没有被引用&#xff0c;则优先分配到栈上&#xff0c;否则分配到堆上。判断语句&#xff1a;…

tomcat

1. 简述静态网页和动态网页的区别。 静态网页是指在服务器存储的网页内容保持不变&#xff0c;不会根据用户的请求或其他条件而改变。它的内容是固定的&#xff0c;无法根据用户的不同需求进行个性化或实时更新。静态网页一般由HTML、CSS和JavaScript等静态资源组成&#xff0…

引入联合GraphQL以解决系统架构中的问题

随着使用需求的增长&#xff0c;用户群的扩大以及新功能的引入&#xff0c;让工程师按照业务的主要领域进行组织变得不可避免。当这些领域在单个实体&#xff08;如类、服务、应用程序或代码库&#xff09;的层面变得过于庞大难以管理时&#xff0c;引入联合GraphQL成为优化系统…

华为、阿里巴巴、字节跳动 100+ Python 面试问题总结(六)

系列文章目录 个人简介&#xff1a;机电专业在读研究生&#xff0c;CSDN内容合伙人&#xff0c;博主个人首页 Python面试专栏&#xff1a;《Python面试》此专栏面向准备面试的2024届毕业生。欢迎阅读&#xff0c;一起进步&#xff01;&#x1f31f;&#x1f31f;&#x1f31f; …

web前端框架Javascript之JavaScript 异步编程史

早期的 Web 应用中&#xff0c;与后台进行交互时&#xff0c;需要进行 form 表单的提交&#xff0c;然后在页面刷新后给用户反馈结果。在页面刷新过程中&#xff0c;后台会重新返回一段 HTML 代码&#xff0c;这段 HTML 中的大部分内容与之前页面基本相同&#xff0c;这势必造成…