iis服务器助手广告广告
返回顶部
首页 > 资讯 > 操作系统 >Python垃圾回收及Linux Fork
  • 846
分享到

Python垃圾回收及Linux Fork

Python垃圾回收LinuxFork 2022-06-04 23:06:35 846人浏览 独家记忆
摘要

目录1.linux fork简介1.Copy-On-Write策略增加python多进程内存占用的原因3.解决办法前言: 在口袋助理看到了其他部门的同事针对Python2内存占用做的一点优化工作,自己比较感兴趣,遂记录下

目录
  • 1.linux fork简介
  • 1.Copy-On-Write策略增加python多进程内存占用的原因
  • 3.解决办法

言:

在口袋助理看到了其他部门的同事针对Python2内存占用做的一点优化工作,自己比较感兴趣,遂记录下。

1.Linux fork简

fork是Linux提供的创建子进程的系统调用。为了优化创建进程速度,Linux内核使用了Copy-on-Write的方式去创建进程,所谓Copy-on-Write是指执行fork之后,
内核并不立即给子进程分配物理内存空间,而是让子进程的虚内存映射到父进程的物理内存。仅仅当子进程向地址空间中执行写入操作时,才给它分配一段物理内存。
通过这种方式既优化了进程创建的时间,又减少了子进程的内存占用。

1.Copy-On-Write策略增加Python多进程内存占用的原因

Python GC采用引用技术的方式去管理对每个对象的引用,每一个被GC跟踪的对象会由一个PyGC_Head的结构体去表示。如下所示,其中gc_refs就是每个对象的引用计数值,
当我们在子进程中读取父进程创建的对象的时候,就会导致子进程的虚地址空间中的gc_refs加1,从而触发了内核的缺页中断,这是内核就会给子进程创建新的物理内存。
仅仅是简单的读取操作就会导致新的内存空间产生。


typedef uNIOn _gc_head
{
  struct {
    union _gc_head *gc_next;
    union _gc_head *gc_prev;
    Py_ssize_t gc_refs;
  } gc;
  long double dummy; 
} PyGC_Head;

3.解决办法

python3的解决方法:

针对这个问题,python3.7增加了三组api(有instagram团体提交的)[1]。

Python垃圾回收及Linux Fork

freeze用于将GC追踪的所有对象都移动到永生代(permanent generation),之后垃圾回收会忽略这些被设置为永生代的对象。

实际使用中,我们可以在父进程中执行freeze函数,然后子进程中使用和父进程共享的对象,这样对象的引用技术就不会增加,从而避免了COW的发生。

python2的解决方法:

  • (1) 针对Python2,我们可以简单的把Python3的相关函数KABUFDaJ移植过来
  • (2) 使用multiprocessing.Array去共享数据。Array会从共享内存中取一段取存储数据,并不会增加引用技术值,从而触发COW。

实现方面,Array使用Posix共享内存 + mmap去实现。[3]

#!/usr/bin/env python
# coding=utf-8
from multiprocessing import Array
import os
import sys

def foo():
  shared_cache = Array('i', range(0, 100), lock=False)
  pid = os.fork()
  if pid > 0:
    print("parent:", sys.getrefcount(shared_cache))
  elif pid == 0:
    print("child:", sys.getrefcount(shared_cache))


foo()

到此KABUFDaJ这篇关于Python垃圾回收及Linux Fork的文章就介绍到这了,更多相关Python垃圾回收及Linux Fork内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

参考:

1.https://instagram-engineering.com/copy-on-write-friendly-python-garbage-collection-ad6ed5233Ddf
2.Https://llvllatrix.Wordpress.com/2016/02/19/python-vs-copy-on-write/
3.https://GitHub.com/python/cpython/blob/main/Lib/multiprocessing/shared_memory.py

--结束END--

本文标题: Python垃圾回收及Linux Fork

本文链接: https://www.lsjlt.com/news/21539.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python垃圾回收及Linux Fork
    目录1.linux fork简介1.Copy-On-Write策略增加python多进程内存占用的原因3.解决办法前言: 在口袋助理看到了其他部门的同事针对Python2内存占用做的一点优化工作,自己比较感兴趣,遂记录下...
    99+
    2022-06-04
    Python垃圾回收 LinuxFork
  • Python垃圾回收及Linux Fork
    目录1.Linux fork简介1.Copy-On-Write策略增加Python多进程内存占用的原因3.解决办法前言: 在口袋助理看到了其他部门的同事针对Python2内存占用做的...
    99+
    2022-11-12
  • Python垃圾回收及Linux Fork实例分析
    这篇文章主要介绍了Python垃圾回收及Linux Fork实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python垃圾回收及Linux Fork实例分析文章都会有所收获,下面我们...
    99+
    2023-06-26
  • java 垃圾回收机制以及经典垃圾回收器详解
    判断对象存活方法 引用计数法:在对象中添加一个引用计数子,每当一个地方引用他时,计数器就加一,当引用失效时,计数器就减一。 会有对象循环引用问题: objA.instance =...
    99+
    2022-11-12
  • python垃圾回收机制!
    python的三种垃圾回收机制:1.python采用的是引用计数机制为主;2.标记-清除;为辅的策略3.分代收集(隔代回收、分代回收)为辅的策略 现在的高级语言如java,c#等,都采用了垃圾收集机制,而不再是c,c++里用户自己管理维护内...
    99+
    2023-01-31
    机制 垃圾 python
  • JVM垃圾回收——G1垃圾收集器
    目录 一、什么是G1垃圾收集器 二、G1垃圾收集器的内存划分 三、G1垃圾收集器的收集过程  四、G1收集器的优缺点 五、G1收集器的JVM参数配置 一、什么是G1垃圾收集器         Garbage First(简称G1)收集...
    99+
    2023-10-25
    jvm java G1
  • python对象销毁(垃圾回收)
    '''python对象销毁(垃圾回收)''' class Point: 'info class' def __init__(self,x=0,y=0): self.x = x self.y...
    99+
    2023-01-31
    对象 垃圾 python
  • 理解Python垃圾回收机制
    一.垃圾回收机制 Python中的垃圾回收是以引用计数为主,分代收集为辅。引用计数的缺陷是循环引用的问题。 在Python中,如果一个对象的引用数为0,Python虚拟机就会回收这个对象的内存。 #en...
    99+
    2022-06-04
    机制 垃圾 Python
  • Python垃圾回收机制详解
    目录1. 引用计数2. 标记-清除3. 分代回收4. 其他4.1 JNI(Java Native Interface)总结 Python 的GC模块主要运用了引用计数来跟踪和回收垃圾...
    99+
    2022-11-12
  • 垃圾回收机制
      我们定义变量会申请内存空间来存放变量的值,而内存的容量是有限的,当一个变量值没有用了(称为垃圾),就应该将其占用的内存给回收掉。变量名是访问到变量的唯一方式,所以当一个变量值没有任何关联的变量名时,我们就无法访问到该变量了,该变量就是...
    99+
    2023-01-30
    机制 垃圾
  • java中的垃圾回收机制以及经典垃圾回收器的详细介绍
    本篇内容介绍了“java中的垃圾回收机制以及经典垃圾回收器的详细介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!判断对象存活方法引用计数法...
    99+
    2023-06-20
  • .NET垃圾回收器原理及使用
    .NET 应用程序中的垃圾回收器是什么? 垃圾收集器只不过是 CLR 提供的一个功能,可帮助我们清理或销毁未使用的托管对象。通过清理或销毁这些未使用的托管对象,它基本上回收内存。 当...
    99+
    2022-11-13
  • 浅谈Python的垃圾回收机制
    一.垃圾回收机制 Python中的垃圾回收是以引用计数为主,分代收集为辅。引用计数的缺陷是循环引用的问题。 在Python中,如果一个对象的引用数为0,Python虚拟机就会回收这个对象的内存。 #en...
    99+
    2022-06-04
    浅谈 机制 垃圾
  • python语法 之垃圾回收机制
    目录一 引入二、什么是垃圾回收机制?三、为什么要用垃圾回收机制?四、垃圾回收机制原理分析4.1、什么是引用计数?4.2、引用计数扩展阅读4.2.1 标记-清除4.2.2 分代回收一 ...
    99+
    2022-11-10
  • Python垃圾回收机制的原理
    本篇内容介绍了“Python垃圾回收机制的原理”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  引用计数器为主  标记清除和分代回收为辅  ...
    99+
    2023-06-01
  • python垃圾回收机制是什么
    Python的垃圾回收机制是自动化的,它使用了引用计数和循环垃圾收集两种方法。1. 引用计数:Python中的每个对象都有一个引用计...
    99+
    2023-08-14
    python
  • GC垃圾回收机制
    GC垃圾回收机制 一、 GC原理:1、为什么进行垃圾回收 二、JVM与回收算法:1、内存分配2、回收算法1、标记-清除(Mark-sweep)2、复制(Copying)3、标记-整理(Ma...
    99+
    2023-09-24
    jvm java 算法
  • day09(垃圾回收机制)
    1,复习 文件处理 1.操作文件的三步骤 -- 打开文件:硬盘的空间被操作系统持有 | 文件对象被应用程序持续 -- 操作文件:读写操作 -- 释放文件:释放操作系统对硬盘空间的持有 2.基础的读写 ...
    99+
    2023-01-31
    机制 垃圾
  • HDFS垃圾回收箱的配置及使用
    本篇内容介绍了“HDFS垃圾回收箱的配置及使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!HDFS为每个用户创建一个回收站:目录:/use...
    99+
    2023-06-03
  • .Net的GC垃圾回收原理及实现
    一、先了解下必备的知识前提 内存中的托管与非托管,可简单理解为: 托管:可借助GC从内存中释放的数据对象(以下要描述的内容点) 非托管:必须手工借助Dispose释放资源(实现自ID...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作