设为首页 收藏本站
查看: 880|回复: 0

[经验分享] python的垃圾回收机制

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2017-3-23 10:10:22 | 显示全部楼层 |阅读模式
进程空间
进程运行时需要在内核中占据一段内存空间,用以存储程序和数据。
每个进程空间分布如下所示:
iyunv.com-2017-3-2340.png
进程空间的结构
  • text段:
    代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。
  • data段:
    数据段(data segment)通常用来存放程序中已初始化的全局变量数据段属于静态内存分配。
  • bss段:
    bss(Block Started by Symbol) 通常用来存放程序中未初始化的全局变量。bss段属于静态内存分配。
  • 堆(heap):
    堆用于存放动态变量,它的大小并不固定,可动态扩张或缩减。
    主要由程序员手工分配:
      当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上;
      当利用free等函数释放内存时,被释放的内存从堆中被剔除。
  • 栈(stack):
    存储局部、临时变量,函数调用时,存储函数的返回指针,用于控制函数的调用和返回,在程序块开始时自动分配内存,结束时自动释放内存,主要由编译器自动管理。
      在函数被调用时,其参数会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。

注:堆和栈的区别参见末尾附图1.
可能产生的问题
内存泄漏
当程序中使用malloc的时候,堆(heap)会向上增长,其增长的部分就成为malloc从内存中分配的空间。malloc开辟的空间会一直存在,直到程序员手工用free系统调用来释放,或者进程结束。
内存泄漏(memory leakage), 就是指我们没有释放不再使用的堆空间,导致堆不断增长,而内存可用空间不断减少。
栈溢出
栈和堆的大小则会随着进程的运行增大或者变小。当栈和堆增长到两者相遇时候,也就是内存空间图中stack和heap之间的可用内存区域完全耗尽时,进程会出现栈溢出(stack overflow)的错误,导致进程终止。
垃圾回收机制(Garbage-Collection)
由上文可知,进程的内存管理是十分重要的,内存需要被合理分配使得进程能够正常运行,避免出现内存泄漏、栈溢出等异常情况。
内存空间是有限的,不能一味地分配内存,需要有人负责回收分配出去的内存空间,如果交由程序员手动进行内存管理,程序员就比较累,没法完全专注于业务逻辑的实现,影响开发效率,而且手动管理内存是纯技术活,人工错误很常见,这就有了垃圾回收机制(Garbage-Collection),程序员只要专注于业务逻辑的实现,尽管用内存,不必关心内存的回收。
垃圾回收机制(Garbage-Collection)的职能:
识别那些垃圾对象,从垃圾对象那回收内存。并分配给新生成的对象使用。
历史上几种经典的GC算法:标记-清除算法和引用计数法
python采用的是引用计数机制为主,标记-清除和分代回收两种机制为辅的策略
引用计数机制
  优点:简单且具备实时性:一旦一个对象的引用计数归零,内存就直接释放了。不用像其他机制等到特定时机。实时性还带来一个好处:处理回收内存的时间分摊到了平时。
  缺点:维护引用计数消耗资源,无法回收循环引用对象。
频繁的垃圾回收会降低程序执行效率,Python只会在特定条件下,自动启动垃圾回收。Python解释器保持对新创建的对象,以及因为引用计数为零而被释放掉的对象的追踪,当被分配对象的计数值与被释放对象的计数值之差达到某一阈值时便启动垃圾回收机制。
Python也采用了分代回收的策略。基于“存活时间越久的对象越不容易成为垃圾。”这一假说,若某一对象在经历多次垃圾回收后依然健在,则提升该对象的等级。对象等级一共分0,1,2三代,每次垃圾回收从0代开始,经过一定次数对0代对象的垃圾回收后,便启动对0代和1代对象的垃圾回收,1代对象经过一定次数的的垃圾回收,便启动对0代1代2代即所有对象的垃圾回收。
查看方法
import gc gc.set_threshold(700, 10, 5)
返回(700, 10, 10),后面的两个10是与分代回收相关的阈值,后面可以看到。700即是垃圾回收启动的阈值。
若要手动启动垃圾回收,使用gc.collect()。

附图1
iyunv.com-2017-3-2341.png

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-353963-1-1.html 上篇帖子: 用python生成指定位数的密码 下篇帖子: Python实现打印量统计 垃圾回收 python
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表