文章目录
一、各语言内存管理
C和C++:没有内存管理,完全是靠程序员手动释放和申请。
java:通过关键字new为对象申请内存空间,由GC决定和执行对象的释放。
二、Python内存管理&术语
python中一切皆对象,这些对象内存在运行时动态分配。
python变量无需事先申明和指定类型,程序员无需关心内存管理,python解释器会自动回收。
这一切由python内存管理器承担复杂的内存管理工作。
1、内存分配
Python解释器在运行时为程序分配内存。当程序创建变量、对象或函数时,解释器会在内存中为其分配空间。Python使用堆来管理内存,这意味着内存分配和释放是动态的。
2、引用计数
Python使用引用计数来跟踪对象的引用数量。每当一个对象被引用时,其引用计数会增加;当一个引用被删除时,其引用计数会减少。当一个对象的引用计数为0时,解释器会将其标记为垃圾并回收其内存。
3、循环引用
在Python中,循环引用是一种常见的问题。当两个或多个对象相互引用时,它们的引用计数永远不会为0,因此无法被垃圾回收。Python通过周期检测来解决循环引用问题。当检测到循环引用时,解释器会将其标记为垃圾并回收其内存。
当两个对象a和b相互引用时,因此引用计数不会归零,对象也不会销毁,从而导致内存泄露。为解决这一问题,解释器会定期执行一个循环检测器,搜索不可访问对象的循环并删除它们。
三、内存管理机制(垃圾回收机制)
python主要采用引用计数机制为主,标记-清除和分代收集(分代回收)两种机制为辅的策略。
1、引用计数机制
引用计数是一种垃圾回收机制,当python的某个对象的引用计数为0时,该对象就成为要被回收的垃圾,但是并不是立马回收,而是等到garbage collection (GC)触发时才回收。
注意:
(1)、栈内存、堆内存
-
栈内存:存放变量和内存地址
-
堆内存:存放值
(2),GC的效率:
在垃圾回收时,python不能进行其他任务,频繁的垃圾回收会大大降低python的工作效率;
原因是GIL的存在,当GC运行的时候,会抢python解释器锁,其他线程处于阻塞状态,会降低python的工作效率,所以GC的回收不要那么频繁。
(3),GC的启动:
当python运行时,会记录其中分配对象和取消对象的次数,当二者的差值高于某个阈值(默认700)时,垃圾回收才会启动。
(4),GC的触发:
- 主动调用gc.collect()
- GC达到阈值时自动触发
- 程序退出时
查看引用计数:
使用sys包中的getrefcount(),来查看某个对象的引用计数。
需要注意的是,当使用某个引用作为参数,传递给getrefcount()时,参数实际上创建了一个临时的引用。因此,getrefcount()所得到的结果,会比期望的多1。