Python面经【10】- Python内存管理机制专题

Python的内存管理机制及调优手段

Python的内存管理是自动的,主要是由垃圾收集器和内存分配器组成。
Python(尤其是CPython实现)主要采用以下几种内存管理机制,其中包括引用计数、垃圾回收和内存池等技术。

1) 引用计数

引用计数是一种非常高效的内存管理手段,当一个python对象被引用时其引用数增加1,当其不在被一个变量引用时则计数减1。当引用计数等于0时回收对象。

2) 垃圾回收

(1) 引用计数

引用计数也是一种垃圾收集机制,而且也是一种最直观,最简单的垃圾收集技术。当 Python 的某个对象的引用计数降为 0 时,说明没有任何引用指向该对象,该对象就成为要被回收的垃圾了。比如某个新建对象,它被分配给某个引用,对象的引用计数变为 1。如果引用被删除,对象的引用计数为 0,那么该对象就可以被垃圾回收。不过如果出现循环引用的话,引用计数机制就不再起有效的作用了。

(2) 标记清除

如果两个对象的引用计数都为 1,但是仅仅存在他们之间的循环引用,那么这两个对象都是需要被回收的,也就是说,它们的引用计数虽然表现为非 0,但实际上有效的引用计数为 0。所以先将循环引用摘掉,就会得出这两个对象的有效计数。

(3) 分代回收

因为垃圾回收机制每次回收内存,都需要将所有的对象引用计数都遍历一遍,这是非常耗时的,所以在历经多次扫描的情况下,都没有被回收的变量,垃圾回收机制就会将他们按等级划分,垃圾回收机制就会认为该变量是常用的变量,对其的扫描频率就会降低。这使得垃圾收集机制需要处理的内存少了,效率自然就提高了。

3) 内存池

当创建大量消耗小内存的对象时,频繁调用new/malloc会导致大量的内存碎片,致使效率降低。内存池的作用就是预先在内存中申请一定数量的,大小相等的内存块留作备用,当有新的内存需求时,就先从内存池分配给这个需求,不够之后再申请新的内存。这样做最显著的优势就是能减少内存碎片,提升效率。
(1) Python的内存池是一个缓存区,用于管理小于256个字节的对象的内存分配,比如整型数值、字符串、元组等小块内存对象。
(2) 当程序需要创建这些小块对象时,python会从内存池中分配一段内存空间,并将其划分为多个大小的块,保存在内存池中
(3) 当程序需要销毁这些对象时,python会将它们标记为未使用状态,并不会立即释放内存,如果真是那样,频繁地申请、释放内存空间会使Python的执行效率大打折扣,从内存池申请的内存用完将会归还到内存池中,避免了频繁的内存分配和释放操作。

关于python程序的运行方面,有什么手段能提升性能?

  1. 使用多进程,充分利用机器的多核性能。
  2. 对于性能影响较大的部分代码,可以使用C或C++代码
  3. 尽量使用python的内建函数
  4. 尽量使用局部变量
  5. 对于IO阻塞造成的性能表现,可以使用IO多路复用来解决。

垃圾回收(Garbage Collection, GC)机制的原理

Python的垃圾回收机制采用引用计数为主,标记-清除和分代回收机制为辅的策略。其中,标记-清除机制用来解决计数引用带来的循环引用无法释放内存的问题。分代回收机制是为了提升来及回收的效率。

  • 什么是内存泄漏:
    内存泄漏是应用程序分配某段内存后,由于设计错误,失去对该段内存的控制,因而造成了内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
    在这里插入图片描述

一个对象包含地址id,type类型,存放的value;其中每个对象包含了两个头部信息,一个是类型标志符(即对象的类型type),一个是计数器。计数器反应的是该对象被引用的次数,一旦这个计数器为0,代表没有变量引用该对象,该对象的内存空间就会自动回收。这样的一个好处是在python编程时可以任意使用对象而不用考虑释放内存空间,一旦该对象没有变量引用后,会自动清理和释放。

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值