编译原理之美
宫文学
北京物演科技CEO
立即订阅
8171 人已学习
课程目录
已完结 43 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 为什么你要学习编译原理?
免费
实现一门脚本语言 · 原理篇 (13讲)
01 | 理解代码:编译器的前端技术
02 | 正则文法和有限自动机:纯手工打造词法分析器
03 | 语法分析(一):纯手工打造公式计算器
04 | 语法分析(二):解决二元表达式中的难点
05 | 语法分析(三):实现一门简单的脚本语言
06 | 编译器前端工具(一):用Antlr生成词法、语法分析器
07 | 编译器前端工具(二):用Antlr重构脚本语言
08 | 作用域和生存期:实现块作用域和函数
09 | 面向对象:实现数据和方法的封装
10 | 闭包: 理解了原理,它就不反直觉了
11 | 语义分析(上):如何建立一个完善的类型系统?
12 | 语义分析(下):如何做上下文相关情况的处理?
13 | 继承和多态:面向对象运行期的动态特性
实现一门脚本语言 · 应用篇 (2讲)
14 | 前端技术应用(一):如何透明地支持数据库分库分表?
15 | 前端技术应用(二):如何设计一个报表工具?
实现一门脚本语言 · 算法篇 (3讲)
16 | NFA和DFA:如何自己实现一个正则表达式工具?
17 | First和Follow集合:用LL算法推演一个实例
18 | 移进和规约:用LR算法推演一个实例
实现一门脚本语言 · 热点答疑与用户故事 (2讲)
19 | 案例总结与热点问题答疑:对于左递归的语法,为什么我的推导不是左递归的?
用户故事 | 因为热爱,所以坚持
编译原理 · 期中考试周 (1讲)
期中考试 | 来赴一场100分的约定吧!
免费
实现一门编译型语言 · 原理篇 (12讲)
20 | 高效运行:编译器的后端技术
21 | 运行时机制:突破现象看本质,透过语法看运行时
22 | 生成汇编代码(一):汇编语言其实不难学
加餐 | 汇编代码编程与栈帧管理
23 | 生成汇编代码(二):把脚本编译成可执行文件
24 | 中间代码:兼容不同的语言和硬件
25 | 后端技术的重用:LLVM不仅仅让你高效
26 | 生成IR:实现静态编译的语言
27 | 代码优化:为什么你的代码比他的更高效?
28 | 数据流分析:你写的程序,它更懂
29 | 目标代码的生成和优化(一):如何适应各种硬件架构?
30 | 目标代码的生成和优化(二):如何适应各种硬件架构?
实现一门编译型语言 · 应用篇 (2讲)
31 | 内存计算:对海量数据做计算,到底可以有多快?
32 | 字节码生成:为什么Spring技术很强大?
实现一门编译型语言 · 扩展篇 (3讲)
33 | 垃圾收集:能否不停下整个世界?
34 | 运行时优化:即时编译的原理和作用
35 | 案例总结与热点问题答疑:后端部分真的比前端部分难吗?
面向未来的编程语言 (3讲)
36 | 当前技术的发展趋势以及其对编译技术的影响
37 | 云编程:云计算会如何改变编程模式?
38 | 元编程:一边写程序,一边写语言
结束语 (1讲)
结束语 | 用程序语言,推动这个世界的演化
编译原理之美
登录|注册

33 | 垃圾收集:能否不停下整个世界?

宫文学 2019-11-08
对于内存的管理,我们已经了解了栈和栈桢,在编译器和操作系统的配合下,栈里的内存可以实现自动管理。
不过,如果你熟悉 C 和 C++,那么肯定熟悉在堆中申请内存,也知道要小心维护所申请的内存,否则很容易引起内存泄漏或奇怪的 Bug。
其实,现代计算机语言大多数都带有自动内存管理功能,也就是垃圾收集(GC)。程序可以使用堆中的内存,但我们没必要手工去释放。垃圾收集器可以知道哪些内存是垃圾,然后归还给操作系统。
那么这里会有几个问题,也是本节课关注的重点:
自动内存管理有哪些不同的策略?这些策略各自有什么优缺点?
为什么垃圾收集会造成系统停顿?工程师们又为什么特别在意这一点?
相信学完这节课之后,你对垃圾收集的机制理解得会更加深刻,从而在使用 Java、Go 等带有垃圾收集功能的语言时,可以更好地提升回收效率,减少停顿,提高程序的运行效率。
当然,想要达到这个目的,你首先需要了解什么是内存垃圾,如何发现哪些内存是没用的?

什么是内存垃圾

内存垃圾是一些保存在堆里的对象,但从程序里已经无法访问。
在堆中申请一块内存时(比如 Java 中的对象实例),我们会用一个变量指向这块内存。这个变量可能是:全局变量、常量、栈里的变量、寄存器里的变量。我们把这些变量叫做 GC 根节点。它指向的对象中,可能还包含指向其他对象的指针。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《编译原理之美》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(2)

  • 沉淀的梦想
    看了很多关于并发收集的文章,但是还是云里雾里的,感觉得对照着GC的实现源码学习才能明白

    作者回复: 推荐你看两个GC的源代码:一个是Lua的,一个是Juila的。我最近时间不充裕,不够时间自己写一个GC。但我后面会补上。

    2019-11-08
    2
  • LEGEND OF HEART
    曾经在生产环境遇到过GC的问题,我们做的是一个数据监控系统。当时的现象是,程序偶现会在某些时间点丢数据,然后程序的粒度是秒级别的,所以丢数据用户感知会很强烈。一开始是怀疑程序bug导致数据采集错误,但是想了很久,查了日志,做了很多测试都没有复现。后来想到是不是GC影响的,用GC Viewer查看了GC日志,果然,发现了程序耗费了很多时间在full GC上,占了运行时间的42.8%。基本明白了是GC的问题之后,我就开始想,是不是程序分析的无用数据太多了?还是程序的运行内存开的太小了?还是说垃圾收集器选择的有问题?试了一下,清理了一些无用数据,并将程序内存调大,运行了一段时间,gc的次数和时间明显减少了。上面的案例,算是一次简单的GC问题定位吧,后续其实还是出现了几次GC问题,仿照上面的思路,看看GC日志,基本也可以把问题找出来。

    作者回复: 非常感谢你的经验分享!GC是调优的重要环节。

    2019-11-08
    1
收起评论
2
返回
顶部