Java - 垃圾回收的几种算法简述

本文简要介绍了Java中四种主要的垃圾回收算法:标记-清除、复制、标记-整理和分代收集。这些算法用于自动管理内存,确保程序高效运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java - 垃圾回收的几种算法简述


1、标记-清除算法
1、先标记需要回收的对象
2、标记完成后统一回收标记的对象

一方面,标记清除效率不高
另一方面,因为对象的大小的随机性,而产生大量不连续的小的不可用内存空间(内存碎片),
从而导致大对象的创建容易产生内存空间不足而提前触发 GC
2、复制算法
1、把可用内存空间一分为二,每次使用其中一块
2、用完时,复制所有存活的对象到新的内存空间,然后回收旧的内存空间

### Java 垃圾回收算法面试题及详细解答 #### 问题一:什么是垃圾收集? 垃圾收集是指自动释放不再使用的对象所占用的内存空间的过程。通过这种方式,程序不需要手动管理内存资源,减少了程序员的工作量并降低了内存泄漏的风险[^1]。 #### 问题二:简述常见的垃圾收集算法有哪些? 常见垃圾收集算法主要包括标记清除法、复制算法、标记整理法和分代收集理论: - **标记清除算法**:该方法分为两个阶段,“标记”阶段会遍历所有可达的对象,在这些对象上做记号;“清除”阶段则负责扫描整个堆区,找到未被标记的对象并将其回收。这种方法简单易懂但是存在效率低下的缺点,并且容易造成大量不连续的空间碎片。 - **复制算法**:为了避免上述缺陷,提出了这种新思路——把可用内存按容量划分为大小相等的两部分A/B,每次只使用其中一部分。当这部分满了之后就将存活下来的对象全部移到另一侧去,然后再清理掉原来那一半的内容。不过这样做虽然解决了之前提到的问题,却浪费了一半以上的存储区域作为备用缓冲区。 - **标记整理算法**:综合了前两种方式的优点而诞生的新方案。“标记”的操作同前者一致,但在完成这项任务后不是直接删除无用实体而是让所有的有效实例向一段特定位置靠拢(通常是起始地址),最后统一处理剩下的空白区间即可。这样既不会产生过多零散的小块又提高了整体利用率。 - **分代收集理论**:基于这样一个观察结果:“绝大多数情况下,刚创建不久的数据很快就会变成垃圾”,因此可以根据对象生命周期长短的不同来划分不同的世代来进行针对性更强更高效的清扫作业。一般而言新生代采用的是快速但消耗较多额外开销的方式如上面说过的几种之一;老年代因为里面存放着长期存在的东西所以采取相对保守稳妥的做法比如周期性的进行全面排查等等。 ```java // 示例代码展示如何触发一次完整的GC过程 public class GCTest { private static final int _1MB = 1024 * 1024; public static void main(String[] args) throws InterruptedException { byte[] allocation1, allocation2, allocation3; // 分配大对象进入老年代 allocation1 = new byte[2 * _1MB]; Thread.sleep(5000); allocation2 = new byte[2 * _1MB]; Thread.sleep(5000); allocation3 = new byte[2 * _1MB]; // 让allocation1成为可回收状态 allocation1 = null; System.gc(); // 显式请求JVM进行垃圾回收 // 继续分配更多对象... } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

简简单单OnlineZuozuo

感谢哥哥姐姐的打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值