垃圾回收的知识点

为什么要有垃圾回收?

在编程中,动态分配内存是一种常见的操作。当程序动态分配内存后,如果不再需要这部分内存,应该将其释放以便其他程序使用。然而,在手动管理内存的情况下,程序员需要显式地跟踪内存的分配和释放,容易出现内存泄漏(分配的内存未被释放)或者野指针(指向已释放内存的指针)等问题。为了解决这些内存管理问题,引入了垃圾回收机制。

垃圾回收主要回收哪个内存区域?

垃圾回收主要回收堆内存中不再使用的对象。堆内存是用来存储动态分配的内存对象的区域,而栈内存则用来存储局部变量和函数调用信息。

标记的过程:

标记阶段是垃圾回收的一部分,用于标记所有活动对象。这个过程通过从根对象开始,递归遍历对象图,标记所有可以访问到的活动对象,而无法访问到的对象则被标记为垃圾等待回收。

回收的过程:

回收阶段是垃圾回收的另一个关键步骤,目的是将已经标记为垃圾的对象进行回收,并释放它们所占用的内存空间。回收过程可以采用不同的算法,例如标记-清除、复制、标记-整理等。

垃圾回收器有哪些典型实现?

垃圾回收器有多种典型实现,常见的包括:

  1. 标记-清除(Mark and Sweep):标记出所有活动对象,然后清除未标记的垃圾对象。

  2. 复制(Copying):将存活的对象复制到另一个空间,清除未复制的对象。

  3. 标记-整理(Mark and Compact):标记出所有活动对象,然后将它们整理到一端,清除另一端的垃圾对象。

  4. 分代(Generational):根据对象的存活时间将内存分为不同代,针对不同代采用不同的回收策略。

这些是常见的垃圾回收器实现方式,不同的实现方式在性能和内存利用率上有各自的优劣。

相关推荐
ZZZS05164 分钟前
stack栈练习
c++·笔记·学习·算法·动态规划
hans汉斯30 分钟前
【人工智能与机器人研究】基于力传感器坐标系预标定的重力补偿算法
人工智能·算法·机器人·信号处理·深度神经网络
邓不利东1 小时前
Spring中过滤器和拦截器的区别及具体实现
java·后端·spring
草履虫建模2 小时前
Redis:高性能内存数据库与缓存利器
java·数据库·spring boot·redis·分布式·mysql·缓存
苹果醋32 小时前
Vue3组合式API应用:状态共享与逻辑复用最佳实践
java·运维·spring boot·mysql·nginx
vortex52 小时前
算法设计与分析:分治、动态规划与贪心算法的异同与选择
算法·贪心算法·动态规划
Micro麦可乐2 小时前
Java常用加密算法详解与实战代码 - 附可直接运行的测试示例
java·开发语言·加密算法·aes加解密·rsa加解密·hash算法
掉鱼的猫2 小时前
Java MCP 鉴权设计与实现指南
java·openai·mcp
前端拿破轮2 小时前
🤡🤡🤡面试官:就你这还每天刷leetcode?连四数相加和四数之和都分不清!
算法·leetcode·面试
努力的小郑3 小时前
Spring三级缓存硬核解密:二级缓存行不行?一级缓存差在哪?
java·spring·面试