2017/2/7
描述
在一篇js的文章中看到, 闭包会导致内存泄露( 所以不用滥用 )
联想到python中, 使用 @装饰器 是非常常见的,
那么, 有内存泄露的实例吗 ?
2017/2/7
在一篇js的文章中看到, 闭包会导致内存泄露( 所以不用滥用 )
联想到python中, 使用 @装饰器 是非常常见的,
那么, 有内存泄露的实例吗 ?
2 回答5.1k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
4 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
3 回答1.2k 阅读✓ 已解决
1 回答1.7k 阅读✓ 已解决
1 回答1.2k 阅读✓ 已解决
以下是我的了解
我们常说的
js
的闭包导致内存问题,这个真不是js
本身的锅,这是IE
垃圾回收机制(GC)的bug(好像某个版本前的Firefox
也是)。用 js 的应该都知道,js 语言本身是不包含 DOM 对象的,DOM 对象是由浏览器生成和管理的,而IE浏览器的 DOM 对象 GC 机制用的是单纯的引用计数。
所以,当出现
DOM
的循环引用的时候,IE
的 GC 完全没法回收,内存就泄露了。闭包只是比较容易产生循环应用,纯js对象的循环引用,是不会内存泄露的。只有在某些浏览器上,当js对象和DOM对象循环引用了,才可能内存泄露。
然后说下
python
python 虽然是引用计数为主的GC模式,但是加上了检测 reachable (标记-清除和分代收集)的机制为辅,所以大部分循环引用是没有问题的。也不用担心装饰器造成类似 js 的内存泄露问题。
但是 python 循环引用还有可能触发不可回收的问题的(比如自定义
__del__
的对象循环引用),不过比较少见,如果想了解请自行搜索。