Python的内存管理机制
Python 默认内存处理机制为GC(垃圾回收)
内存泄漏
指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。
- 内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后, 由于设计错误, 失去了对该段内存的控制, 因而造成了内存的浪费, 导致程序运行速度减慢甚至系统崩溃等严重后果。有
__del__()
函数的对象间的循环引用是导致内存泄漏的主凶。 - 不使用一个对象时使用: del object 来删除一个对象的引用计数就可以有效防止内存泄漏问题。
通过 Python 扩展模块 gc 来查看不能回收的对象的详细信息, 也可以通过 sys.getrefcount(obj) 来获取对象的引用计数, 并根据返回值是否为0
来判断是否内存泄漏。
内存管理机制
一. 引用计数
通过引用计数来保持对内存中的变量跟踪Python内部记录中所有在使用对象各有多少个引用。
Python中有个内部跟踪变量叫做引用计数器, 每个变量有多少个引用, 简称引用计数。当对象被创建时就创建了一个引用计数。当某个对象的引用计数为0时, 对象就不在需要, 就列入了垃圾回收队列。
二. 垃圾回收
- 引用计数:每个对象中都有ob-refcnt来做引用计数。当一个对象被引用, ob-refcnt就会增加, 当引用的对象删除, 那么ob-refcnt就会减少, 当ob-refcnt为零, 就会释放该对象的内存空间。
- 标记清除:解决循环引用的问题。先按需分配, 等到没有空闲内存的时候, 从寄存器和程序栈上的引用出发, 遍历所有对象和引用把所有能访问的打标记, 最后将没有标记的对象释放掉。
- 分代技术:提高效率, 提高垃圾回收的效率, 按照存活时间, 分成不同的集合。将内存块按照其存活时间划分为不同的集合。每个集合就称为一个“代”, 垃圾回收的频率随代的存活时间增大而减小。Python默认定义分代对象集合, 引用数越大, 对象的存活时间越长。
三. 内存池机制
- 在Python中, 大多数申请的都是小块的内存, 会执行大量的malloc和free操作。Python引入了一个内存池机制, 用于管理对小块内存的申请和释放, 即Pymalloc机制。它将不用的内存放到内存池而不是返回给操作系统。
- 当申请的内存小于256字节时, PyObject_Malloc会在内存池中申请内存; 当申请的内存大于256字节时, PyObject_Malloc的行为将蜕化为malloc的行为。当然, 通过修改Python源代码, 我们可以改变这个默认值, 从而改变Python的默认内存管理行为。
- 对于Python对象, 如整数, 浮点数和List, 都有其独立的私有内存池, 对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数, 用于缓存这些整数的内存就不能再分配给浮点数。
参考链接:时光不写博客-Python的内存管理机制
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Python写入InfluxDB
InfluxDB是一个开源的时序数据库,使用GO语言开发,特别适合用于处理和分析资源监控数据这种时序相关数据。而InfluxDB自带的各种特殊函数如求标准差,随机取样数据,统计数据变化比等,使数据统计和实时分析变得十分方便。 安装 数据库安装根据不同的系统安装方式不太一样, 具体参考官网, 这个官网提供的挺详细的。 如果有指定版本的requests, 注意一下requests版本, influxdb不支持旧版的requests库, 版本不支持安装时会有提示。 Python安装操作库 python3 -m pip install influxdb pip install --upgrade influxdb # 升级 pip uninstall influxdb # 卸载 使用准备 操作准备需要先创建数据库,可以使用命令行进行创建 create database database_name; 也可以使用python命令直接创建 from influxdb import InfluxDBClient # 首先连接influxdb client = InfluxDBClient(host='...
- 下一篇
HashMap原理及内部存储结构
本文将通过如下简单的代码来分析HashMap的内部数据结构的变化过程。 public static void main(String[] args) { Map<String, String> map = new HashMap<>(); for (int i = 0; i < 50; i++) { map.put("key" + i, "value" + i); } } 1 数据结构说明 HashMap中本文需要用到的几个字段如下: 下面说明一下几个字段的含义 1.1 table // HashMap内部使用这个数组存储所有键值对 transient Node<K,V>[] table; Node的结构如下: 可以发现,Node其实是一个链表,通过next指向下一个元素。 1.2 size 记录了HashMap中键值对的数量 1.3 modCount 记录了HashMap在结构上更改的次数,包括可以更改键值对数量的操作,例如put、remove,还有可以修改内部结构的操作,例如rehash。 1.4 threshold 记录一个临界值,当已存...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS8安装Docker,最新的服务器搭配容器使用
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS关闭SELinux安全模块
- CentOS7设置SWAP分区,小内存服务器的救世主
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装