gc垃圾回收机制算法,python的回收机制是什么
以前不知道javascript的垃圾收集机制。以为只是简单的记号清除方法。即从根对象开始寻找它的引用,然后依次寻找它的引用,依次递归,标记所有被引用的变量。然后,遍历后,清除未标记的变量。
具体文章请参考mdn:
https://developer . Mozilla . org/zh-CN/docs/Web/JavaScript/Memory _ Management
但是javascript中v8引擎的垃圾收集机制比这个稍微复杂一些。
什么是v8引擎javascript无法被系统底层识别。需要一个转换器把js转换成CPU能识别的汇编语言。V8引擎就是这样一个转换器,可以把javascript代码转换成不同架构的CPU公认的汇编语言。但是v8引擎不仅负责编译,还负责代码执行和内存分配。
v8引擎是镀铬的。但由于其出色的性能,nodejs被采用作为js解释器。
分代垃圾收集机制v8将内存分为两个区域,一个是年轻空间,一个是旧空间。
新区比旧区小。
在64位和32位系统上,新区域的最大内存分别是32MB和16MB。
(所以我们在使用node的时候,如果要扩展node的内存大小,可以使用-max-old-space-size和-max-new-space-size来调整新区和旧区的内存大小)
区分新区和老区的依据是:对象的存活时间。
存储在新区域中的对象具有短的生存时间,而存储在旧区域中的对象具有长的生存时间或内存驻留对象。
在新区使用scavenge策略,就是将新区分成两部分,一部分是调用到space的空闲空间,另一部分是从space调用的新区使用的内存。新区域使用的内存会被遍历,活的对象会被检查,然后活的对象会被复制到To空间,From空间会被清空,然后From和To区域会被交换。新区的垃圾收集可以一次完成。
在旧区中,使用mndwdm-sweep和mndwdm-compact来清理旧区中幸存的对象,复制幸存对象的效率会很低。而旧区面积大的话,如果分成两个区域,会浪费一半的空间。因此,在旧区使用mndwdm-sweep和mndwdm-compact。
遍历堆中的对象并标记活的对象。穿越后清除未标记的。
未标记的对象被清除后,会有很多碎片化(不连续)的内存空间,这样的碎片化内存空间会导致后续的内存分配出现问题。因为很可能会出现一个很大的对象,所有的碎片空间都满足不了这个分配,所以会提前触发垃圾收集,这个收集是不必要的。
所以清除标记后,幸存对象的内存空间会被移动,使其内存空间连续,这样就没有零碎的内存空间了。
垃圾收集的定时为了避免垃圾收集机制运行,javascript运行改变内存。Javascript在垃圾收集机制期间停止运行。垃圾收集之后,javascript继续执行应用程序逻辑。
在小型垃圾收集中,只收集新的区域。因为新区域默认配置的很小,而且里面幸存的对象通常都很小,所以即使暂停也影响不大。
但是老区面积大,活物多,停顿时间长了会影响性能。因此,旧区域被优化:
增量:将垃圾收集分成许多小步骤。在每一小步之后,让javascript执行一段时间。垃圾收集和应用程序逻辑交替执行,直到标记阶段完成。
参考:
v8发动机是如何工作的?
Js内存管理
chrome v8垃圾收集
《深入浅出node.js》
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。