python存储机制 || 垃圾回收机制 || 分代回收
(1)由于python中万物皆对象,所以python的存储问题是对象的存储问题,并且对于每个对象,python会分配一块内存空间去存储它
(2)对于整数和短小的字符等,python会执行缓存机制,即将这些对象进行缓存,不会为相同的对象分配多个内存空间
(3)容器对象,如列表、元组、字典等,存储的其他对象,仅仅是其他对象的引用,即地址,并不是这些对象本身
垃圾回收机制
Python的垃圾回收机制采用引用计数机制为主,标记-清除和分代回收机制为辅的策略。
其中,标记-清除机制用来解决计数引用带来的循环引用而无法释放内存的问题,
分代回收机制是为提升垃圾回收的效率。
从基本原理上,当Python的某个对象的引用计数降为0时,说明没有任何引用指向该对象,
该对象就成为要被回收的垃圾了。比如某个新建对象,它被分配给某个引用,对象的引用计数变为1。
如果引用被删除,对象的引用计数为0,那么该对象就可以被垃圾回收。
分代回收
Python将所有的对象分为0,1,2三代;
所有的新建对象都是0代对象;
当某一代对象经历过垃圾回收,依然存活,就被归入下一代对象。
Python将所有的对象分为0,1,2三代。所有的新建对象都是0代对象。
当某一代对象经历过垃圾回收,依然存活,那么它就被归入下一代对象。
垃圾回收启动时,一定会扫描所有的0代对象。如果0代经过一定次数垃圾回收,那么就启动对0代和1代的扫描清理。
当1代也经历了一定次数的垃圾回收后,那么会启动对0,1,2,即对所有对象进行扫描。
Python通过引用计数来保存内存中的变量追踪,即记录该对象被其他使用的对象引用的次数。
>>> a=[1,2] >>> import sys >>> sys.getrefcount(a) ## 获取对象a的引用次数 2 >>> b=a >>> sys.getrefcount(a) 3 >>> del b ## 删除b的引用 >>> sys.getrefcount(a) 2 >>> c=list() >>> c.append(a) ## 加入到容器中 >>> sys.getrefcount(a) 3 >>> del c ## 删除容器,引用-1 >>> sys.getrefcount(a) 2 >>> b=a >>> sys.getrefcount(a) 3 >>> a=[3,4] ## 重新赋值 >>> sys.getrefcount(a) 2
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现