• 内存管理


    赋值语句内存分析

    • 使用id()方法访问内存地址
    • 使用is比较内存引用地址是否相等
    def mem(var,l=[]):
    	l.append(val)
    	return 1
    
    list1 = mem(10)
    list2 = mem(123,[])
    list3 = mem('a')

    垃圾回收机制

    • 以引用计数为主,分代收集为辅
    • 如果一个对象的引用数为0,Python虚拟机就会回收这个对象的内存
    • 引用计数的缺陷是循环引用的问题

    引用计数(reference count)

    • 每个对象都有存有指向该对象的引用总数 
    • 查看某个对象的引用计数sys.getrefcount()
    • 可以使用del关键字删除某个引用
    class gc(object):
    	def __init__(self):
    		print('对象产生:{0}'.format(id(self)))
    	def __del__(self):
    		print('对象删除:{0}'.format(id(self)))
    
    def f0():
    	'''对象产生后,马上删除,引用由1变成0,内存被回收'''
    	while True:
    		c1 = gc()
    		# del cl
    
    def f1():
    	l = []
    	while True:
    		c1 = gc()
    		l.append(c1)
    		print(len(l))

    垃圾回收

    • 满足特定条件,自动启动垃圾回收
    • 当Python运行时,会记录其中分配对象(object allocation)和取消分配对象(object deallocation)的次 数
    • 当两者的差值高于某个阈值时,垃圾回收才会启动
    • 查看阈值gc.get_threshold()

    分代回收

    • Python将所有的对象分为0,1,2三代
    • 所有的新建对象都是0代对象
    • 某一代对象经历过垃圾回收,依然存活,那么它就被 归入下一代对象

    手动回收

    • gc.collect()手动回收
    • objgraph模块中的count()记录当前类产生的实例对象 的个数

    内存管理机制

    内存池(memory pool)机制

    当创建大量消耗小内存的对象时,频繁调用new/malloc 会导致大量的内存碎片,致使效率降低。内存池的概念就 是预先在内存中申请一定数量的,大小相等的内存块留作 备用,当有新的内存需求时,就先从内存池中分配内存给 这个需求,不够了之后再申请新的内存。这样做最显著的 优势就是能够减少内存碎片,提升效率。

    Python3中的内存管理机制——Pymalloc

    针对小对象(<=512bytes),pymalloc会在内存池中申请内存空间

    当>512bytes,则会PyMem_RawMalloc()和 PyMem_RawRealloc()来申请新的内存空间

    单位换算

    1 Byte = 8 Bits(即 1B=8b) 1 KB = 1024 Bytes
    1 MB = 1024 KB
    1 GB = 1024 MB

    备注:Bit意为“位”或“比特”,是计算机运算的基础,属 于二进制的范畴;Byte意为“字节”,是计算机文件大小的 基本计算单位

  • 相关阅读:
    lambda函数
    linux 自学系列:wc命令
    linux 自学系列:chmod 权限操作
    linux 自学系列:创建、删除目录、移动、更名文件或目录
    linux 自学系列:vi、vim编辑工具
    《架构之美》学习随笔:设计第一步
    安装memcache 时提示error while loading shared libraries: libevent2.0解决办法
    《架构之美》学习随笔:保证质量
    linux 自学系列:环境变量设置
    logging模块学习笔记:logger 对象、日志等级
  • 原文地址:https://www.cnblogs.com/liqianlong/p/13586056.html
Copyright © 2020-2023  润新知