扫码关注官方订阅号
2017/2/7
在一篇js的文章中看到, 闭包会导致内存泄露( 所以不用滥用 )
联想到python中, 使用 @装饰器 是非常常见的, 那么, 有内存泄露的实例吗 ?
小伙看你根骨奇佳,潜力无限,来学PHP伐。
以下是我的了解
我们常说的js的闭包导致内存问题,这个真不是js本身的锅,这是IE垃圾回收机制(GC)的bug(好像某个版本前的Firefox也是)。
js
IE
Firefox
用 js 的应该都知道,js 语言本身是不包含 DOM 对象的,DOM 对象是由浏览器生成和管理的,而IE浏览器的 DOM 对象 GC 机制用的是单纯的引用计数。所以,当出现 DOM 的循环引用的时候,IE 的 GC 完全没法回收,内存就泄露了。闭包只是比较容易产生循环应用,纯js对象的循环引用,是不会内存泄露的。只有在某些浏览器上,当js对象和DOM对象循环引用了,才可能内存泄露。
DOM
然后说下python
python
python 虽然是引用计数为主的GC模式,但是加上了检测 reachable (标记-清除和分代收集)的机制为辅,所以大部分循环引用是没有问题的。也不用担心装饰器造成类似 js 的内存泄露问题。
但是 python 循环引用还有可能触发不可回收的问题的(比如自定义__del__的对象循环引用),不过比较少见,如果想了解请自行搜索。
__del__
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
以下是我的了解
我们常说的
js的闭包导致内存问题,这个真不是js本身的锅,这是IE垃圾回收机制(GC)的bug(好像某个版本前的Firefox也是)。用 js 的应该都知道,js 语言本身是不包含 DOM 对象的,DOM 对象是由浏览器生成和管理的,而IE浏览器的 DOM 对象 GC 机制用的是单纯的引用计数。
所以,当出现
DOM的循环引用的时候,IE的 GC 完全没法回收,内存就泄露了。闭包只是比较容易产生循环应用,纯js对象的循环引用,是不会内存泄露的。只有在某些浏览器上,当js对象和DOM对象循环引用了,才可能内存泄露。
然后说下
pythonpython 虽然是引用计数为主的GC模式,但是加上了检测 reachable (标记-清除和分代收集)的机制为辅,所以大部分循环引用是没有问题的。也不用担心装饰器造成类似 js 的内存泄露问题。
但是 python 循环引用还有可能触发不可回收的问题的(比如自定义
__del__的对象循环引用),不过比较少见,如果想了解请自行搜索。