浅谈gc-垃圾回收

2024-09-06 03:48
文章标签 回收 浅谈 垃圾 gc

本文主要是介绍浅谈gc-垃圾回收,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

垃圾回收(Garbage Collection 简称GC

垃圾回收几种常用的算法有

l 引用计数法

l 标记清除法

l 复制算法

l 标记压缩法

引用计数法

引用计数法实现非常简单,对于对象A,只要有任何对象引用了A,则A的引用计数器则加1,当引用失效时则减1。只要对象A的引用计数器达到0,则对象A是不能被使用的,在下次GC时,则被当做回收对象被回收。


 

引用计数算法只需要为每个对象增加一个引用计数器即可。但是引发两个比较严重的问题:

1. 无法处理循环引用的对象,相互引用。所以Java中排除掉此种回收算法。

2. 每次引用产生跟消除时,都需要做一次加减法操作,对效率会有一定的影响。

 

 

标记清除法

首先介绍一下,标记清除法是现在垃圾回收算法的基础。标记清除法讲垃圾回收分为两个阶段:标记计算、清除阶段。一种可行的实现是通过对象根节点,标记所有从跟节点开始的所有可达对象。因此,未被标记的对象就是未被引用对象。然后在清除阶段中清除所有未被标记的对象。但是此算法有个非常大的弊端,会产生很多内存空间碎片。空间碎片使用的效率相对来说是比较低下的。

 

 

复制算法

复制算法的核心思想是:将原有的内存一分为二,每次仅仅只是使用其中的一块内存。其中复制算法回收内存分几步:第一步把所有的正在使用的对象复制到未被使用的内存中。第二步把正在使用的内存全部清空。第三步交换内存角色,完成垃圾回收。

此算法的缺点是,复制算法首先要折损一半内存,还有就是当存活对象远远多于回收对象时,此算法效率相比之下就非常低了。但是此算法优势是回收内存以后,不会存在内存碎片。

 

Java的新生代串行垃圾回收器中,使用了复制算法的思想。新生代中首先会有大量经常被回收的内存,新生代又分为Eden区,from区,to区。其中from区、to区被称为survivor区(幸存者空间),用于存放未被回收对象。另外介绍一下from区跟to区两块内存空间大小相等,地位相等,可进行角色互换的空间块。

 

上图所示复制算法是适用于新生代回收机制的,效果比较好。(新生代是回收对象多于存活对象)

 

标记压缩法

上述复制算法的有个弊端是损耗一倍内存作为替补区,标记压缩算法把此算法进行优化了一下。标记压缩算法在老年代回收使用比较多,跟标记算法一样,也是从对象的跟节点进行标记,但是之后并不是简单的清除对象。而是把可存活对象移动到内存一端,并且保存引用关系。最后清理掉所有边界外边的对象。这样类似在标记算法做完以后重新做一次内存整理。

 

 

 

 

 

 

 

 

 

这篇关于浅谈gc-垃圾回收的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1140920

相关文章

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

浅谈mysql的not exists走不走索引

《浅谈mysql的notexists走不走索引》在MySQL中,​NOTEXISTS子句是否使用索引取决于子查询中关联字段是否建立了合适的索引,下面就来介绍一下mysql的notexists走不走索... 在mysql中,​NOT EXISTS子句是否使用索引取决于子查询中关联字段是否建立了合适的索引。以下

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

解读GC日志中的各项指标用法

《解读GC日志中的各项指标用法》:本文主要介绍GC日志中的各项指标用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、基础 GC 日志格式(以 G1 为例)1. Minor GC 日志2. Full GC 日志二、关键指标解析1. GC 类型与触发原因2. 堆

使用Python实现Windows系统垃圾清理

《使用Python实现Windows系统垃圾清理》Windows自带的磁盘清理工具功能有限,无法深度清理各类垃圾文件,所以本文为大家介绍了如何使用Python+PyQt5开发一个Windows系统垃圾... 目录一、开发背景与工具概述1.1 为什么需要专业清理工具1.2 工具设计理念二、工具核心功能解析2.

浅谈Redis Key 命名规范文档

《浅谈RedisKey命名规范文档》本文介绍了Redis键名命名规范,包括命名格式、具体规范、数据类型扩展命名、时间敏感型键名、规范总结以及实际应用示例,感兴趣的可以了解一下... 目录1. 命名格式格式模板:示例:2. 具体规范2.1 小写命名2.2 使用冒号分隔层级2.3 标识符命名3. 数据类型扩展命

JVM垃圾回收机制之GC解读

《JVM垃圾回收机制之GC解读》:本文主要介绍JVM垃圾回收机制之GC,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、死亡对象的判断算法1.1 引用计数算法1.2 可达性分析算法二、垃圾回收算法2.1 标记-清除算法2.2 复制算法2.3 标记-整理算法2.4

SpringBoot应用中出现的Full GC问题的场景与解决

《SpringBoot应用中出现的FullGC问题的场景与解决》这篇文章主要为大家详细介绍了SpringBoot应用中出现的FullGC问题的场景与解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录Full GC的原理与触发条件原理触发条件对Spring Boot应用的影响示例代码优化建议结论F

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col

浅谈mysql的sql_mode可能会限制你的查询

《浅谈mysql的sql_mode可能会限制你的查询》本文主要介绍了浅谈mysql的sql_mode可能会限制你的查询,这个问题主要说明的是,我们写的sql查询语句违背了聚合函数groupby的规则... 目录场景:问题描述原因分析:解决方案:第一种:修改后,只有当前生效,若是mysql服务重启,就会失效;