进程的内存结构及Python的GC机制

进程空间

进程运行时需要在内核中占据一段内存空间,用以存储程序和数据。

每个进程空间分布如下所示:

进程空间的结构
  • 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


栈和堆的对比
参考资料:

[转载]Python垃圾回收机制--完美讲解! - 简书
http://www.jianshu.com/p/1e375fb40506
Python深入06 Python的内存管理 - Vamei - 博客园
http://www.cnblogs.com/vamei/p/3232088.html
为什么Python要使用有明显缺陷的引用计数而不是像JavaScript一样的标记清除? - 编程 - 知乎
https://www.zhihu.com/question/33529443?sort=created

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,064评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,606评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,011评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,550评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,465评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,919评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,428评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,075评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,208评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,185评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,191评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,914评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,482评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,585评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,825评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,194评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,703评论 2 339

推荐阅读更多精彩内容

  • 1.什么是垃圾回收? 垃圾回收(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供...
    简欲明心阅读 89,303评论 17 311
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,154评论 11 349
  • 这篇文章是我之前翻阅了不少的书籍以及从网络上收集的一些资料的整理,因此不免有一些不准确的地方,同时不同JDK版本的...
    高广超阅读 15,507评论 3 83
  • 原文阅读 前言 这段时间懈怠了,罪过! 最近看到有同事也开始用上了微信公众号写博客了,挺好的~给他们点赞,这博客我...
    码农戏码阅读 5,932评论 2 31
  • SVM如何避免过拟合 过拟合(Overfitting)表现为在训练数据上模型的预测很准,在未知数据上预测很差。过拟...
    Arya鑫阅读 10,583评论 1 1