Python的内存管理,一般从以下三个方面来说:
1)对象的引用计数机制(四增五减)
2)垃圾回收机制(手动自动,分代回收)
3)内存池机制(大m小p)
1)对象的引用计数机制
要保持追踪内存中的对象,Python使用了引用计数这一简单的技术。sys.getrefcount(a)可以查看a对象的引用计数,但是比正常计数大1,因为调用函数的时候传入a,这会让a的引用计数+1
2)垃圾回收机制
吃太多,总会变胖,Python也是这样。当Python中的对象念模越来越多,它们将占据越来越大的内存。不过你不用太担心Python的体形,它会在适当的时候“减肥”,启动垃圾回收(garbage
collection),将没用的对象清除
从基本原理上,当Python的某个对象的引用计数降为0时,说明没有任何引用指向该对象,该对象就成为要被回收的垃圾了
比如某个仔迟缓新建对象,它被分配给某个引用,对象的引用计数变为1。如果引用被删除,对象的旦哪引用计数为0,那么该对象就可以被垃圾回收。
然而,减肥是个昂贵而费力的事情。垃圾回收时,Python不能进行其它的任务。频繁的垃圾回收将大大降低Python的工作效率。如果内存中的对象不多,就没有必要总启动垃圾回收。
所以,Python只会在特定条件下,自动启动垃圾回收。当Python运行时,会记录其中分配对象(object
allocation)和取消分配对象(object deallocation)的次数。当两者的差值高于某个阈值时,垃圾回收才会启动。
我们可以通过gc模块的get_threshold()方法,查看该阈值。
3)内存池机制
Python中有分为大内存和小内存:(256K为界限分大小内存)
1、大内存使用malloc进行分配
2、小内存使用内存池进行分配
python中的内存管理机制都有两套实现,一套是针对小对象,就是大小小于256K时,pymalloc会在内存池中申请内存空间当大于256K时,则会直接执行系统的malloc的行为来申请内存空间。
python程序在运行过程之中会单独开辟出一个进程来执行,而很多小伙伴都发现程序在运行过程之中所占用的内存会越来越大,但是不知道是什么原因以及如何解决。那么下文会来讲解一下python程序内存占用过大的原因和解决方法,感兴趣的和有需要的话就往下看看吧。一、原因
首先需要知道的一点就是,python是面向对象编程的语言,那么就表示在其程序之中一切皆为对象。而每一个对象在创建是都会在内存中开辟空间来占用位置,这样就会造成一开始的内存占用。
虽然说python中有自己的内存管理机制和垃圾处理方凳渗式,但是它对于一些占用内存过多的对象不会马上释放,只有当这个对象不处于引用状态时才会处理它。
二、瞎春解决方法
既然知道了python程序内存都是因为有对象才将其占用的,那么正确的解决方法就是将对象在调用完毕之后马上删除掉。该方法需要用到关键字del和gc模块,使用del关键字删除变量之后,调用gc模块来马上启动python垃枣神脊圾处理机制就可以直接将其彻底从内存空间清除,代码示例如下所示:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)