当前位置:首页 > 内存 > 正文

python如何进行内存管理

  • 内存
  • 2024-06-12 06:06:17
  • 447

一、python内存管理机制由于Python中的一切都是对象,因此Python的存储问题就是对象存储问题。事实上,对于每个对象,python都会分配内存空间来存储它。
那么Python如何分配内存、如何管理内存以及如何释放内存呢?
总结起来有几个方面:引用计数、垃圾回收、内存池机制
Python内部使用引用计数来跟踪内存中的对象。Python内部记录有多少个对象。是。一个参考,也就是说参考的数量
1.创建对象a='abc'
2对象被引用b=a
3。该对象被其他对象引用li=[1,2,a]
4。该对象作为参数传递给函数:foo(x)
1变量被删除。dela或delb
2。该变量引用了其他对象b=c或a=c
3。变量离开作用域(函数调用结束。例如,当函数foo(x)时)。在两端之上,x指向的对象引用减1。
4.从其他引用对象中移除(remove)(a)
5。小部件本身被破坏:delli,或者小部件本身离开范围。
即对象p的属性引用了d,对象d的属性也引用了p。因此,简单地删除对象p和d并不能释放它们的内存空间,因为它们确实如此。总是被引用。深入解释一下,循环引用之后,p和d的引用次数都是2。去掉对象p和d之后,两者的引用次数都变成了1,而不是0,Python只能检查这个一个对象被引用。当数字为0时,它的内存会被自动释放,所以这里p和d的内存空间不能被释放
垃圾收集机制:①引用计数,②清除标记,③磁带回收
引用计数也是一种垃圾收集机制,也是最直观、最简单的垃圾收集技术。当Python中某个对象的引用计数下降到0时,就说明存在。没有指向该对象的引用。该对象成为需要回收的废物。(如果发生循环引用,引用计数机制将不再起作用)
优点:实时性简单,缺点:维护引用计数消耗资源,无法解决循环引用。
如果两个对象的引用计数都为1,但它们之间只有循环引用,那么这两个对象都必须被回收,这意味着即使它们的引用计数不为0,但实际上有效引用计数为0,所以如果先去掉循环引用,就会得到这两个对象的有效引用计数。
标记和擦除算法也有明显的缺陷:在擦除之前。对于非活动对象,应该顺序扫描整个堆内存,即使只剩下少量活动对象,也应该扫描所有对象。
为了提高效率,很多物体经过多次清洗后仍然存在。可以认为这些对象不需要经常回收。它们可以分为不同的集合和。每个集合的回收时间。间隔不同。简单来说,这就是Python的分代再训练。
具体来说,python垃圾分为第1代、第2代和第3代。第1代对象在每次回收时都会被清理,当时清理后有引用的对象仍然存在。它将进入第二代系列。同样,清理第二代集合时存在的对象将进入第三代集合。
每次收集的清理时间如何分配:先清理一代垃圾,清理一代垃圾10次后,清理二代垃圾一次,清理二代垃圾后10次​​,第3代垃圾将作为垃圾清理。
在Python中,请求的内存通常由小块内存组成。当频繁调用期间创建大量低内存对象时,这些小内存块将在申请后不久被释放。new/malloc会造成较高的内存碎片,导致效率降低。
内存池的概念是预先在内存中申请一定数量大小相等的内存块作为备份。当有新的内存请求时,会按需从内存池中分配内存。首先,当这还不够时,再次请求新的内存。这种方法最重要的优点是可以减少内存碎片,提高效率。
Python分为大内存和小内存:(256KB是内存大小限制)
当大小小于256KB时,pymalloc会申请内存中的内存空间水池。当大于256KB时,那么会直接执行new/malloc行为来申请新的内存空间
在python中,对于-5到256之间的数据,系统会分配一块区域内存默认为每个数字,后面跟在赋值时,它们会指向一个固定分配的内存区域
运行py程序时,解释器会分配空内存来存储由纯单词字符组成的字符串(数字、字母、下划线)
在对字符串值进行赋值时,首先会检查要赋值的字符串是否已经存在于内存区域中。如果存在,它将指向现有的内存。它不存在,它将指向盛大整数中现有的内存。在池中分配一块内存来存储这个字符串。


二、Python是怎样管理内存的?内存管理是由Python的私有堆空间来处理的,因此Python对象和数据结构驻留在私有堆中。Python解释器负责处理这个问题。
Python对象的堆空间分配是由Python内存管理器完成的,核心API为程序员编写代码提供了一些工具。
Python有一个内存垃圾收集器来回收和转储所有未使用的内存。

上一篇:java内存管理

下一篇:关于Python内存管理