24 | GC实例:Python和Go的内存管理机制是怎样的?
海纳
你好,我是海纳。
我们前面几节课主要是以 Java 为例,介绍了 JVM 中垃圾回收算法的演进过程。实际上,除了 JVM 之外,用于运行 JavaScript 的 V8 虚拟机、Lua 虚拟机、Python 虚拟机和 Go 的虚拟机都采用了自动内存管理技术。这节课,我们就一起来分析一下它们的实现。
通过这节课,你将会看到垃圾回收算法的设计是十分灵活而且多种多样的,这会为你以后改进应用中自动或半自动的内存管理,提供很好的参考。你要注意的是,学习自动内存管理,一定要抓住核心原理,不要陷入到细节里去。另外,你可以通过查看虚拟机源代码来验证自己的猜想,但不要把源代码教条化。
接下来,我先解释一下为什么选择 Python 和 GO 这两种语言做为例子。
静态语言和动态语言
我先介绍两个基本概念:动态语言和静态语言。动态语言的特征是可以在运行时,为对象甚至是类添加新的属性和方法,而静态语言不能在运行期间做这样的修改。
动态语言的代表是 Python 和 JavaScript,静态语言的代表是 C++。Java 本质上是一门静态语言,但它又提供了反射(reflection)的能力为动态性开了一个小口子。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文深入分析了Python和Go两种流行编程语言的内存管理机制。首先介绍了动态语言和静态语言的基本概念,然后详细解释了Python对象的布局、引用计数的维护以及垃圾回收过程。文章还提到了Python为了解决循环引用问题引入的双向链表和标记清除的过程。接着,文章简要介绍了Go语言的特点,指出了其分配算法复杂但清除算法简单的特点。文章还介绍了Go语言采用的垃圾回收算法是并发标记清理(CMS)算法,以及Go的内存分配策略和TCMalloc的分配思想。通过对Go的三级内存管理器和对象分配机制的介绍,读者可以更深入地了解Go的内存管理机制。最后,文章详细介绍了Go的内存回收机制,包括清除终止阶段、标记阶段、标记终止阶段和清除阶段。整体来看,本文为读者提供了深入了解动态语言和静态语言内存管理的机制和原理的机会。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《编程高手必学的内存知识》,新⼈⾸单¥59
《编程高手必学的内存知识》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(6)
- 最新
- 精选
- 费城的二鹏最后一集课程啦,感谢老师的细致讲解! 思考题,我猜一下值类型的优点吧,值类型都在栈上分配,随用随释放,有利于减少gc压力。
作者回复: Good~希望有机会再见~
2021-12-223 - 夏请问下老师,go垃圾回收过程中mutator assists的任务和目的是什么,谢谢
作者回复: 哦,这一点可能要结合前边g1 gc的讲解来看。有些时候,gc的压力比较大,gc线程可能忙不过来,这时候mutator线程可以帮做一些事情,比如mark的动作。g1里也有refine的动作可能由mutator来做的情况。
2022-01-08 - 那时刻请问老师,有了值类型的介入,编译器只需要关注函数内部的逃逸分析(intraprocedural escape analysis),而不用关注函数间的逃逸分析。 为什么有值类型介入后,就不需要关注函数间逃逸分析了呢?2021-12-2315
- 愣锤老师讲的真好,我为什么没有V8的垃圾回收详细教程呢?或者有没有推进?2022-04-241
- hcyycb正在学习Go语言,很开心在这节课明白了Go的内存管理机制。2022-01-011
- 骨汤鸡蛋面请问下go的虚拟内存布局和三级内存管理如何结合起来看呢2022-07-12
收起评论