【Python】Python内存管理机制

简介: 从一道简单的面试题开始:list和tuple区别在lis

1.1 可变对象和不可变对象

从一道简单的面试题开始:listtuple区别

list集合中可以实现元素的添加、修改、插入、以及删除,由下面的例子可看出并没有要求list里的每个元素必须是相同的数据类型。

list = [1, 'abc']
print(list) # 输出[1, 'abc']

在tuple集合中,一旦元素被存储,以后就不能修改,删除了,这比list集合安全许多,所以能用tuple就用tuple。

回顾:不可变对象:数字 字符串 元组tuple ;可变对象:字典 列表list 字节数组。

1.2 Python垃圾回收

Python中万物皆对象,在Python中的存储问题也是对象的存储问题。python变量不许指定类型,程序员也无需关心内存管理,因为有Python内存管理器:python内存池 + 垃圾回收机制。

(1)垃圾回收

垃圾回收主要以引用计数为主,缺点:不能解决对象的“循环引用”、需要额外空间维护引用计数

引用计数改变的情况:

以下四种情况,对象的引用计数+1:

对象被创建(a=11)、

对象被引用(b=a)、

对象被作为参数传到函数中 func(a)、

对象作为一个元素存储在容器中(如lst1=[a,a])

以下四种情况,对象的引用计数-1:

对象的别名被显式销毁 del a、

对象的别名被赋予新的对象 a=66、

一个对象离开其作用域(如fun函数执行完,

fun里的局部变量,注意全局变量不会),对象所在的容器被销毁或从容器中删除对象

#!/usr/bin/python
## -*- coding: utf-8 -*-
import sys
def func(c):
    print ('in func function',sys.getrefcount(c)-1)
print ('init',sys.getrefcount(11)-1)
a=11
print ('after a=11----',sys.getrefcount(11)-1)
b=a
print ('after b=a----',sys.getrefcount(11)-1)
func(11) #调用函数中是+2:另一个引用是函数栈保存了入参对形参的引用
print ('after func(11)----',sys.getrefcount(11)-1)
lst1=[a,12,14]
print ('after lst1=[a,12,14]----',sys.getrefcount(11)-1)
a=666
print ('after a=666----',sys.getrefcount(11)-1)
del a
print ('after del a----',sys.getrefcount(11)-1)
del b
print ('after del b----',sys.getrefcount(11)-1)
del lst1
print ('after del lst1----',sys.getrefcount(11)-1)

结果为

init 50
after a=11---- 51
after b=a---- 52
in func function 54
after func(11)---- 52
after lst1=[a,12,14]---- 53
after a=666---- 52
after del a---- 52
after del b---- 51
after del lst1---- 50

(2)标记-清除 and 分代回收

垃圾回收机制以引用机制为主,标记-清除,和分代回收机制为辅的策略:

标记-清除机制:用来解决计数引用带来的循环引用而无法释放内存的问题(循环引用只有在容器对象才会产生,如字典、元组、列表等);

标记阶段,遍历所有的对象,如果是可达的(reachable),也就是还有对象引用它,那么就标记该对象为可达

清除阶段,再次遍历对象,如果发现某个对象没有标记为可达(即为Unreachable),则就将其回收

分代回收机制:为提升提升垃圾回收的效率。

1.3 Python内存池

Python内存管理器除了典型的垃圾回收机制,还有Python内存池,下图为CPython(Python解释器)的内存架构图:

image.png

python的对象管理主要位于Level+1~Level+3层

Level+3层:对于python内置的对象(比如int,dict等)都有独立的私有内存池,对象之间的内存池不共享,即int释放的内存,不会被分配给float使用

Level+2层:当申请的内存大小小于256KB时,内存分配主要由 Python 对象分配器(Python’s object allocator)实施

Level+1层:当申请的内存大小大于256KB时,由Python原生的内存分配器进行分配,本质上是调用C标准库中的malloc/realloc等函数

关于释放内存方面,当一个对象的引用计数变为0时,Python就会调用它的析构函数。调用析构函数并不意味着最终一定会调用free来释放内存空间,如果真是这样的话,那频繁地申请、释放内存空间会使Python的执行效率大打折扣。因此在析构时也采用了内存池机制,从内存池申请到的内存会被归还到内存池中,以避免频繁地申请和释放动作。

相关文章
|
30天前
|
开发者 Python 容器
深入理解Python迭代器:迭代机制的核心与应用
本文介绍了Python迭代器的核心概念、工作原理和应用场景。迭代器是遍历容器类型数据结构(如列表、元组、字典和集合)的对象,遵循迭代器协议,具有记忆遍历位置和一次性特点。通过实现迭代器协议,开发者能为自定义类型定义迭代行为,实现高效处理大量数据和与其他迭代工具协同工作。迭代器与可迭代对象的区别在于,可迭代对象实现`__iter__()`方法,返回迭代器,而迭代器实现`__next__()`方法,用于逐个访问元素。理解并运用迭代器能提升Python代码的性能和可读性。
|
1月前
|
监控 算法 Java
如何确保Python的内存管理机制能够有效地工作?
【2月更文挑战第19天】【2月更文挑战第57篇】如何确保Python的内存管理机制能够有效地工作?
|
1月前
|
存储 Java Python
谈谈你对 Python 的内存管理机制的理解。
【2月更文挑战第19天】【2月更文挑战第55篇】谈谈你对 Python 的内存管理机制的理解。
|
28天前
|
存储 缓存 Java
金石原创 |【JVM盲点补漏系列】「并发编程的难题和挑战」深入理解JMM及JVM内存模型知识体系机制(1)
金石原创 |【JVM盲点补漏系列】「并发编程的难题和挑战」深入理解JMM及JVM内存模型知识体系机制(1)
37 1
|
1月前
|
监控 安全 算法
深入理解操作系统的内存管理机制
【2月更文挑战第30天】 本文旨在探讨操作系统中至关重要的一环——内存管理。与传统摘要不同,本文将直接点出核心议题:操作系统是如何通过复杂的数据结构和算法实现对计算机内存的有效管理和优化。文章将详细阐述内存管理的关键组成部分,包括内存分配、虚拟内存技术、分页和段机制等,并探讨它们如何共同协作以支持多任务处理和保护系统安全。通过对这些机制的深入了解,读者可以更好地把握操作系统设计之精髓及对现代计算环境的深远影响。
|
2天前
|
存储 算法
深入理解操作系统的内存管理机制
【4月更文挑战第24天】 在现代计算机系统中,操作系统扮演着资源管理者的角色,其中内存管理是其核心职责之一。本文将探讨操作系统如何通过内存管理提升系统性能和稳定性,包括物理内存与虚拟内存的概念、分页机制、内存分配策略以及内存交换技术。我们将透过理论与实践的结合,分析内存管理的关键技术及其对系统运行效率的影响。
|
9天前
|
存储 算法 数据安全/隐私保护
深入理解操作系统的内存管理机制
【4月更文挑战第17天】 在现代计算机系统中,操作系统扮演着资源管理者的角色,其中内存管理是其核心职能之一。本文探讨了操作系统内存管理的关键技术,包括虚拟内存、物理内存分配与回收、分页和分段机制,以及内存交换技术。通过分析这些机制的原理和实现,我们旨在加深读者对操作系统如何有效管理和保护内存资源的理解。
9 1
|
10天前
|
算法
深入理解操作系统的内存管理机制
【4月更文挑战第15天】 本文将探讨操作系统中至关重要的一环——内存管理。不同于通常对内存管理概念的浅尝辄止,我们将深入研究其核心原理与实现策略,并剖析其对系统性能和稳定性的影响。文章将详细阐述分页系统、分段技术以及它们在现代操作系统中的应用,同时比较它们的效率与复杂性。通过本文,读者将获得对操作系统内存管理深层次工作机制的洞见,以及对设计高效、稳定内存管理系统的理解。
|
21天前
|
缓存 监控 算法
深入理解操作系统的内存管理机制
【4月更文挑战第5天】 随着现代计算机系统的发展,操作系统的内存管理已成为确保系统高效稳定运行的关键因素。本文旨在探讨操作系统中内存管理的基本原理、关键技术及其在实际应用中的优化策略。通过分析内存分配、虚拟内存技术以及内存保护和分页机制等方面,揭示内存管理对提升系统性能的重要性,并提供了一系列优化内存使用效率的方法。
|
23天前
|
存储 算法 开发者
深入理解操作系统的内存管理机制
【4月更文挑战第3天】 本文旨在探讨操作系统中至关重要的一环——内存管理。不同于常规的技术分析文章,我们将从宏观和微观两个维度来剖析内存管理的核心原理及其对系统性能的影响。通过深入研究分页、分段以及虚拟内存等关键技术,我们揭示了操作系统如何优化资源分配,实现多任务并发执行的同时保证系统的稳定与高效。本文不仅适用于计算机科学专业的学者和学生,同时也为软件开发者提供了宝贵的参考,帮助他们设计出更高效的程序。

热门文章

最新文章