我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python垃圾回收及Linux Fork

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python垃圾回收及Linux Fork

前言:

在口袋助理看到了其他部门的同事针对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]。

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

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

python2的解决方法:

  • (1) 针对Python2,我们可以简单的把Python3的相关函数移植过来
  • (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()

到此这篇关于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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python垃圾回收及Linux Fork

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

下载Word文档

猜你喜欢

Python垃圾回收及Linux Fork

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

Python垃圾回收及Linux Fork实例分析

这篇文章主要介绍了Python垃圾回收及Linux Fork实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python垃圾回收及Linux Fork实例分析文章都会有所收获,下面我们一起来看看吧。前言:
2023-06-26

python垃圾回收机制!

python的三种垃圾回收机制:1.python采用的是引用计数机制为主;2.标记-清除;为辅的策略3.分代收集(隔代回收、分代回收)为辅的策略现在的高级语言如java,c#等,都采用了垃圾收集机制,而不再是c,c++里用户自己管理维护内存
2023-01-31

垃圾回收机制

我们定义变量会申请内存空间来存放变量的值,而内存的容量是有限的,当一个变量值没有用了(称为垃圾),就应该将其占用的内存给回收掉。变量名是访问到变量的唯一方式,所以当一个变量值没有任何关联的变量名时,我们就无法访问到该变量了,该变量就是一个垃
2023-01-30

python对象销毁(垃圾回收)

'''python对象销毁(垃圾回收)'''class Point: 'info class' def __init__(self,x=0,y=0): self.x = x self.y = y
2023-01-31

理解Python垃圾回收机制

一.垃圾回收机制 Python中的垃圾回收是以引用计数为主,分代收集为辅。引用计数的缺陷是循环引用的问题。 在Python中,如果一个对象的引用数为0,Python虚拟机就会回收这个对象的内存。#encoding=utf-8 __autho
2022-06-04

java中的垃圾回收机制以及经典垃圾回收器的详细介绍

本篇内容介绍了“java中的垃圾回收机制以及经典垃圾回收器的详细介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!判断对象存活方法引用计数法
2023-06-20

浅谈Python的垃圾回收机制

一.垃圾回收机制 Python中的垃圾回收是以引用计数为主,分代收集为辅。引用计数的缺陷是循环引用的问题。 在Python中,如果一个对象的引用数为0,Python虚拟机就会回收这个对象的内存。#encoding=utf-8 __autho
2022-06-04

day09(垃圾回收机制)

1,复习文件处理1.操作文件的三步骤 -- 打开文件:硬盘的空间被操作系统持有 | 文件对象被应用程序持续 -- 操作文件:读写操作 -- 释放文件:释放操作系统对硬盘空间的持有 2.基础的读写with open('
2023-01-31

python垃圾回收机制是什么

Python的垃圾回收机制是自动化的,它使用了引用计数和循环垃圾收集两种方法。1. 引用计数:Python中的每个对象都有一个引用计数器,用来记录有多少个引用指向该对象。当引用计数器为0时,说明没有任何引用指向该对象,对象就会被垃圾回收机制
2023-08-14

Python垃圾回收机制的原理

本篇内容介绍了“Python垃圾回收机制的原理”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  引用计数器为主  标记清除和分代回收为辅  
2023-06-01

PHP的垃圾回收机制

一、原理 php5和php7的垃圾回收机制都是利用引用计数。 二、php5和php7不同点 1、PHP5标量数据类型会计数,PHP7标量数据类型不再计数,不需要单独分配内存。 2、PHP7的zval 需要的内存不再是单独从堆上分配,不再自己存储引用计数。 3、
PHP的垃圾回收机制
2016-04-04

编程热搜

目录