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

两个python程序共用一个内存

  • 内存
  • 2024-07-15 09:00:27
  • 5516

一、Python如何进行内存管理

Python如何管理内存?

答:从三个方面来说,一是对象引用计数机制,二是垃圾回收机制,三是内存池机制。

1.对象引用计数机制

Python在内部使用引用计数来跟踪内存中的对象。

增加引用计数:

1重命名对象

2.将其放入容器(例如列表、元组或字典)中

引用计数减少的情况:

1使用part语句显式销毁对象别名。

2或者是重新赋值

count()函数可以检索对象当前的引用计数

大多数情况下,引用计数比你想象的要大得多。对于不可变数据(例如数字和字符串),解释器在程序的不同部分之间共享内存以节省内存。

相关推荐:《Python视频教程》

2垃圾回收

1当对象的引用计数归零时,就会被回收。该机制处理它。

2当两个对象a和b相互引用时,del语句可以减少a和b的引用计数并销毁用于引用底层对象的名称。但由于每个对象都包含对其他对象的应用,因此引用计数不会重置为零,并且该对象也不会被销毁。(这会导致内存泄漏)。为了解决这个问题,解释器定期执行循环检测器,搜索具有不可用对象的循环并将其删除。

3.内存池机制

Python提供了内存垃圾回收机制,但是它将未使用的内存放入内存池中,而不是返回给操作系统。

oc机制。为了加快Python的执行效率,Python入了内存池机制来管理小块内存的申请和释放。

2Python中所有小于256字节的对象都使用pymalloc实现的分配器,而大对象则使用系统的malloc。

3Python对象,例如整数、浮点数和列表,都有自己独立的私有内存池,并且它们的内存池在对象之间不共享。这意味着,如果分配和释放大量整数,则用于缓存这些整数的内存将无法再分配给浮点数。


二、python的内存问题该这么解决?1.没有启用GC或者GC设置为debug状态,导致交叉引用没有被回收
2当某个数据项逻辑上不应该存在,却因为不相关而进行清除操作代码仍然存在,也是一种泄漏。
例如,我想记录某个基金最近50天的每日收益,定义一个全局字典global_dict并运行一个脚本来计算它,每10分钟计算一次。每次计算只是对dict[date]=rateago"]进行简单的赋值,是不必要的,这是一个泄漏。
3.这种情况在Python3.4之前出现,因为是这样的。如果定义了一个类__del__,this放入e中,不被回收,可以说跳出了生成回收机制,但这种情况在3.4之后的版本中不存在,被回收。