33 | 垃圾收集:能否不停下整个世界?
该思维导图由 AI 生成,仅供参考
什么是内存垃圾
- 深入了解
- 翻译
- 解释
- 总结
垃圾收集是现代计算机语言中的重要功能,通过自动管理堆内存,减少了程序员手动释放内存的工作。本文介绍了内存垃圾的特点和垃圾收集的两种经典算法:标记和清除以及停止和拷贝。标记和清除算法通过标记可达对象并清除不可达对象来进行垃圾收集,但可能存在内存碎片化问题。而停止和拷贝算法则将内存分为旧空间和新空间,通过拷贝可达对象来进行垃圾收集,但可能存在内存利用率不高和系统停顿时间长的问题。分代收集算法将注意力集中在比较“年轻”的数据上,以提高垃圾收集效率。增量收集和并发收集算法则致力于缩短垃圾收集的停顿时间,通过增量式地运行和并发执行垃圾收集工作来提高系统的实时性。这些算法的实现需要编译器的帮助,通过读屏障、写屏障和安全点机制来保证垃圾收集的正确性和不影响程序执行。通过本文的学习,读者可以更深入地了解垃圾收集的机制,从而在使用带有垃圾收集功能的语言时,提升回收效率,减少停顿,提高程序的运行效率。文章还介绍了LLVM对垃圾收集的支持,包括创建安全点、计算栈图、提供写屏障和读屏障的支持,以及与编译器的配合。总之,本文深入探讨了垃圾收集的原理、常见算法和LLVM的支持,为读者提供了全面的了解和实践指导。
《编译原理之美》,新⼈⾸单¥59
全部留言(9)
- 最新
- 精选
- 沉淀的梦想看了很多关于并发收集的文章,但是还是云里雾里的,感觉得对照着GC的实现源码学习才能明白
作者回复: 推荐你看两个GC的源代码:一个是Lua的,一个是Juila的。我最近时间不充裕,不够时间自己写一个GC。但我后面会补上。
2019-11-0812 - HuayraGo的GC不是分代的,Java的是;使用的是并发三色标记算法。 GC可以看看《垃圾回收的算法与实现》这本书。 Go的STW 在1.8版本已经优化到毫秒以下了。
作者回复: 感谢分享。 GC是实现一门现代语言最大的挑战之一。毫秒级以下的停顿确实令人赞叹。
2020-02-068 - LEGEND OF HEART曾经在生产环境遇到过GC的问题,我们做的是一个数据监控系统。当时的现象是,程序偶现会在某些时间点丢数据,然后程序的粒度是秒级别的,所以丢数据用户感知会很强烈。一开始是怀疑程序bug导致数据采集错误,但是想了很久,查了日志,做了很多测试都没有复现。后来想到是不是GC影响的,用GC Viewer查看了GC日志,果然,发现了程序耗费了很多时间在full GC上,占了运行时间的42.8%。基本明白了是GC的问题之后,我就开始想,是不是程序分析的无用数据太多了?还是程序的运行内存开的太小了?还是说垃圾收集器选择的有问题?试了一下,清理了一些无用数据,并将程序内存调大,运行了一段时间,gc的次数和时间明显减少了。上面的案例,算是一次简单的GC问题定位吧,后续其实还是出现了几次GC问题,仿照上面的思路,看看GC日志,基本也可以把问题找出来。
作者回复: 非常感谢你的经验分享!GC是调优的重要环节。
2019-11-087 - Dylan"在拷贝内存之后,你需要修改所有指向这块内存的指针。像 C、C++ 这样的语言,因为内存地址是对编程者可见的,所以没法采用停止和拷贝算法。" 这里有点没太明白,既然内存地址对开发人员可见,那应该是修改指针地址啊
作者回复: 不行呀,这可能造成程序的错误。 在Java、Go等语言里,在运行时有办法知道哪个数值其实是引用(也就是指针)。 在C语言里,一个指针和一个整数编译完毕以后没啥区别。编译器无法判断哪个是指针,哪个其实只是个普通数值。
2020-03-283 - 余晓飞这时,新空间里所有对象整齐排列,没有内存碎片。 这里的“新空间”应该改为“旧空间”。
作者回复: 拷贝完毕以后,新旧空间会互换。这里说的“旧空间”,指的是互换完毕之后的。
2020-01-161 - 余晓飞整个标记过程的直观示意图如下 这句话下面的图中似乎缺少了一步: 标记D,逆转A->D的指针
作者回复: 你看得很仔细,少上传了一张图。感谢帮忙校正!
2020-01-15 - sugar补充分享:JavaScript的v8虚拟机也实现了本文中宫老师所提到的诸多gc算法,旨在优化js的gc问题。v8是分代收集,老生代对象有使用标记清除和标记整理,并且也有应用本文后半段所提到的三色算法来实现并发和增量gc。另外,v8背后的作者lars bak其实就是早年开发某一款java虚拟机的,在采访中他也提到了gc是他认为非常“好玩”的一个领域,因为你永远可以找到更合适的回收时间点。供各位参考~2020-05-0624
- Samaritan.老师,请问下,给一个变量赋予新的地址是怎么实现的呢? 比如我定义一个变量:int var; 感觉var这个变量对应的虚拟地址,在编译完成后应该就定下来了吧?2023-01-23归属地:福建2
- wahaha商业版Java实现Azul Platform Prime号称无停顿GC: https://www.azul.com/products/pricing/ C4 pauseless garbage collector for nearly any size heap (1GB to 8TB) Hyper-optimized Falcon JIT compiler (LLVM) ReadyNow! warmup accelerator GraalVM发布一段时间后,把Java编译为本地代码的工具Excelsior Jet的网站就下线了,但Azul还在,说明Azul的实力不小。2021-10-16