一、目录
1 定义
2 内存泄漏的常见原因
3 检测
4 解决方法
二、实现
-
定义
程序在使用完内存后未正确释放,导致内存占用不断增加,最终耗尽内存资源。python中,由于提供自动内存管理机制(垃圾回收),内存泄漏问题比较少,但仍然会发生。 -
内存泄漏的常见原因
a.循环引用:当两个或多个对象相互引用时,如果没有妥善地处理,可能会导致内存泄漏。垃圾回收器无法识别这种情况,因为这些对象不再被使用,但由于引用计数不为零,无法被垃圾回收。
class A():
def __init__(self):
self.b = None
class B():
def __init__(self):
self.a = None
a = A()
b = B()
a.b = b
b.a = a
解决:
# 打破循环引用
a.b = None
b.a = None
# 错误示例:循环中创建大量临时对象
for i in range(1000000):
temp_list = [i] * 1000000 # 大量临时对象
# 正确做法:不要在循环中创建大对象或者临时对象
# 或者在每次迭代后手动清理资源
del temp_list #清空对象
# 错误示例:对象间产生了强引用循环
class MyClass:
def __init__(self):
self.list_of_myself = []
def leak_memory(self):
for i in range(1000000):
self.list_of_myself.append(self) # 强引用循环
# 正确做法:使用弱引用或者在每次迭代后手动解除引用
# self.l