业务开发算法 50 讲
黄清昊
Hashdata 数据库内核工程师,LeetCode 高赞答主,公众号微扰理论作者
23293 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 51 讲
业务开发算法 50 讲
15
15
1.0x
00:00/00:00
登录|注册

40|垃圾回收:现代语言是如何自动管理回收内存的?

支持大规模堆空间
停顿时间与内存大小无关
停顿时间小于10ms
高内存利用率
低频GC
长生命周期对象
标记-整理算法
ZGC
分代GC
避免大量小对象产生
完备的逃逸分析机制
强内存分配器
不同语言的垃圾回收器
减少停顿时间的努力
垃圾回收算法的正确性
应用程序的停止
停顿时间(STW)
老生代
分代垃圾回收
移动对象成本
解决内存碎片
整理过程
标记过程
内存碎片问题
清除过程
标记过程
不可达对象识别
标记活跃对象
GC根对象
有向图构成
定义垃圾
Java
Golang
把不再继续被应用使用的空间声明为可使用的空间
决定内存中的哪些空间仍在被应用使用中
根据应用的请求提供相应的内存
从操作系统申请和释放动态内存
课后思考题
垃圾回收的挑战
垃圾回收算法的选择
标记-整理算法(Compacting Collector)
标记-清除算法(Tracing Collector)
内存垃圾标记算法
不同的垃圾回收算法
垃圾回收的作用
垃圾回收机制

该思维导图由 AI 生成,仅供参考

你好,我是微扰君。
今天我们来聊一聊和编程语言有关的一个话题——垃圾回收,作为现在许多编程语言都支持的特性,垃圾回收机制能大大解放程序员的心智,让我们把主要精力放在实现业务逻辑上,而不是关注内存分配这样繁琐的编程细节上。
如果你写过 C 语言的话,一定能深切体会到在堆上分配内存是一件多么麻烦的事情。就我个人来说,只要能在栈上分配的内存,我一定尽量都在栈上分配,因为一旦在堆上分配了内存,我们就得时刻谨记要在一个合适的时机把内存释放掉。
其实,释放内存本身并不难,但是在程序的复杂性越来越高的时候,这会带来越来越高的维护成本。
因为当程序中有许多不同的分支时,一旦要修改代码,就需要确保在每个分支下内存都能得到正确地释放,这样,我们每次写关键业务逻辑的代码时,都需要反复斟酌和业务本身没有关系的内容,这就给我们程序员们带来了巨大的心智负担。这也是为什么写过 C 语言的同学,再去写 Golang 和 Java 这样有垃圾回收特性的语言会觉得非常爽,开发效率也能显著提高。
但是,GC 的实现会带来不小的性能开销,在一些性能敏感的场景,比如高频交易或者网关中间件等场景下,我们还是会用到 C\C++ 这样内存分配自主可控的语言。
不过在很多互联网业务场景下,我们其实并没有这么极致的性能追求,偶尔的服务时延抖动在分布式架构下并不造成用户体验的损失。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

现代编程语言的内存管理是一项重要的技术挑战,而垃圾回收算法则是解决这一挑战的关键。本文深入探讨了垃圾回收的重要性和作用,以及Golang和Java采用的不同垃圾回收算法。文章介绍了标记-清除算法和标记-整理算法,以及它们的设计思路和实现原理。此外,还讨论了Golang和Java的垃圾回收算法选择的背后原因,以及Java的ZGC垃圾回收器的设计目标。总的来说,本文对现代编程语言内存管理的基本概念和算法原理进行了深入浅出的介绍,对于想要了解内存管理的读者来说,是一篇值得阅读的文章。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《业务开发算法 50 讲》
新⼈⾸单¥59
立即购买
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部