前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >python内存泄漏问题的一种处理方法

python内存泄漏问题的一种处理方法

作者头像
Michael阿明
发布2023-07-10 14:28:15
发布2023-07-10 14:28:15
34400
代码可运行
举报
运行总次数:0
代码可运行

1. 内存泄漏例子

代码语言:javascript
代码运行次数:0
复制
import tracemalloc 

class Foo:
	def __init__(self):
		self.arr = list(range(1000000))
		self.bar = self
		
tracemalloc.start()

# Run your code
for i in range(10000):
	f = Foo()

	current_mem, peak_mem = tracemalloc.get_traced_memory()
	print(f"Current memory usage is {current_mem / 10**6}MB")
	print(f"Peak was {peak_mem / 10**6}MB")

tracemalloc.stop()

使用 tracemalloc 跟踪内存使用,程序运行结果:

代码语言:javascript
代码运行次数:0
复制
Current memory usage is 36.993044MB
Peak was 36.993112MB
Current memory usage is 73.986112MB
Peak was 73.98618MB
Current memory usage is 110.979124MB
Peak was 110.979192MB
Current memory usage is 147.972136MB
Peak was 147.972204MB
Current memory usage is 184.965148MB
Peak was 184.965216MB
Current memory usage is 221.958232MB
Peak was 221.958232MB
Current memory usage is 258.951316MB
。。。

可以看出内存占用在逐渐变大,新建了一个对象后,没有释放

这个例子会产生内存泄漏,原因是:

  1. class Foo 的实例f创建了一个循环引用:f.bar指向f本身
  2. f如果被其他变量引用,可以保护f不被回收
  3. f.bar也引用了f,形成循环引用,即使外部变量不再引用ff的内存也无法回收,导致内存泄漏

2. gc.collect 手动回收

使用 gc 模块手动回收垃圾

代码语言:javascript
代码运行次数:0
复制
import tracemalloc 
import gc

class Foo:
	def __init__(self):
		self.arr = list(range(1000000))
		self.bar = self

tracemalloc.start()

first_enter_loop = True

# Run your code
for i in range(10000):
	f = Foo()

	current_mem, peak_mem = tracemalloc.get_traced_memory()
	print(f"Current memory usage is {current_mem / 10**6}MB")
	print(f"Peak was {peak_mem / 10**6}MB")

	if not first_enter_loop:
		gc.collect()  # 手动回收垃圾
		print(f"released, Current memory usage is {current_mem / 10**6}MB")
	first_enter_loop = False

tracemalloc.stop()

输出结果:

代码语言:javascript
代码运行次数:0
复制
Current memory usage is 36.993044MB
Peak was 36.993112MB
Current memory usage is 73.986112MB
Peak was 73.98618MB
released, Current memory usage is 73.986112MB
Current memory usage is 73.986531MB
Peak was 73.986531MB
released, Current memory usage is 73.986531MB
Current memory usage is 73.986603MB
Peak was 73.986781MB
released, Current memory usage is 73.986603MB
Current memory usage is 73.986603MB
Peak was 73.986853MB
。。。

可以看出内存的使用恒定在某个数值,不再增大了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-06-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 内存泄漏例子
  • 2. gc.collect 手动回收
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档