Python面经【10】- Python内存管理机制专题
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程序的运行方面,有什么手段能提升性能?
- 使用多进程,充分利用机器的多核性能。
- 对于性能影响较大的部分代码,可以使用C或C++代码
- 尽量使用python的内建函数
- 尽量使用局部变量
- 对于IO阻塞造成的性能表现,可以使用IO多路复用来解决。
垃圾回收(Garbage Collection, GC)机制的原理
Python的垃圾回收机制采用引用计数为主,标记-清除和分代回收机制为辅的策略。其中,标记-清除机制用来解决计数引用带来的循环引用无法释放内存的问题。分代回收机制是为了提升来及回收的效率。
- 什么是内存泄漏:
内存泄漏是应用程序分配某段内存后,由于设计错误,失去对该段内存的控制,因而造成了内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
一个对象包含地址id,type类型,存放的value;其中每个对象包含了两个头部信息,一个是类型标志符(即对象的类型type),一个是计数器。计数器反应的是该对象被引用的次数,一旦这个计数器为0,代表没有变量引用该对象,该对象的内存空间就会自动回收。这样的一个好处是在python编程时可以任意使用对象而不用考虑释放内存空间,一旦该对象没有变量引用后,会自动清理和释放。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!