Python中的虚拟内存管理(2.6-2.7)- 是否会重用为任何类型数据分配的内存?

1 投票
2 回答
3140 浏览
提问于 2025-04-17 10:06

我有一个关于Python中虚拟内存的问题。

当一个程序使用了比较多的内存时,它并不会“释放”那些没用的内存。举个例子,假设我创建了一个很大的字符串列表,这个列表占用了30MB的内存,所以整个程序大概占用了40MB。当我删除这个列表后,程序仍然占用着40MB的内存。但是如果我再创建一个同样大小的数据列表,程序不会再多占用内存,因为它会使用那些还没有释放给操作系统的虚拟内存。

我的问题是:什么样的数据会重新使用这些没有释放的虚拟内存?我的意思是,当我创建字符串列表时,占用了30MB的内存,即使我删除了它,接下来的字符串列表只要在这30MB的范围内,就不会再从操作系统那里申请更多的内存。但是如果我创建的是另一种类型的数据,比如QPixmap(来自Qt,使用PyQt),那它会使用最初由字符串列表分配的那30MB吗?

提前谢谢你。

编辑:嗯,这个问题听起来有点懒。我知道我可以简单地测试这个具体的情况,但我想从理论上了解,我并不想要关于“字符串列表和QPixmap”这个特定案例的答案,而是想知道一般的情况。

2 个回答

0

解决“释放”内存的问题有两个方面:首先,要让Python进行垃圾回收,把不再使用的对象清理掉;其次,要把未使用的内存还给操作系统,这个是在C语言层面上进行的。

如果你发现程序的内存使用量不断增加,几乎可以肯定是因为你没有让对象被垃圾回收。99.9%的情况下(这个数字可以忽略不计 :)),如果你试图去干预Python的C级内存管理,那你很可能是在自找麻烦。

记住,在Python中,只有当没有其他活着的对象再引用某个对象时,这个对象才有可能被垃圾回收。你可能在不知不觉中把某个对象的引用藏在了某个地方。

有一个叫做Dowser的Python工具,可以帮助你找到由于保留对象引用而导致的内存泄漏。如果你发现某个类的对象数量随着时间的推移不断增加……这就是你的内存问题所在。

祝你好运!

0

在C语言层面(也就是CPython的实现),用malloc()分配的内存会占用堆内存,而当你用free()释放这些内存时,这部分内存不会立即归还给操作系统。只有当程序结束时,这些内存才会被释放回操作系统。不过,当你再次用malloc()分配新的内存时,它会使用之前释放的那部分内存。

(当然,如果释放的内存碎片很多,导致没有足够的连续空闲空间来满足新的内存请求,那就另当别论了。不过我们暂时不考虑这种特殊情况。)

每个Python对象在CPython中都是通过一个或多个用malloc()分配的内存块来实现的。所以,简单来说,几乎任何一块Python数据都可以重新利用之前被释放的内存空间。

撰写回答