# -*- coding:utf-8 -*- # python 中是自动管理内存的 # 自动管理内存编程语言,例如:object-c python # 手动管理内存编程语言,例如:C # Python 中的内存管理采用的'引用计数'的方式,如果一个对象的引用计数为0 # 则该对象占用的内存会被python解释器清空,对象也会消失,如果一个对象的引用计数 # 超过0,这个对象会一直存放在内存中 # python中是自动管理内存的,实际上是通过“引用计数”的方式来管理内存。当一个对象 # 被创建出来的时候,引用计数为1,当对象被其他对象引用时,引用计数会+1,当对象的 # 引用被删除时,引用计数会-1。当对象的引用计数为0时,该对象所在的内存会被系统在合适 # 的时间回收 ''' 内存泄漏: 对象在内存无法释放的情况,称之为内存泄漏,内存泄漏会导致程序占用内存过多,程序 出现卡顿的情况,严重情况可能会导致内存崩溃,程序结束或者闪退 过度释放: 对象多次删除,导致引用计数过度减少,在之后的代码中有可能导致该对象不可用 ''' # sys 操作系统模块 import sys class People(object): pass # 当创建一个对象时,这个对象的计数为1 p1 = People() # 通过这个函数可以查看对象的引用计数 # ps:在这查到的是2,自己创建对象的时候+1,编译程序的时候,解释器+1(不需要我们管理) print(sys.getrefcount(p1)) p2 = p1 print(sys.getrefcount(p1)) # 把对象放入列表中,也会造成计数+1 list1 = [p1] print(sys.getrefcount(p1)) # 创建对象 p3 = People() # 给p3添加obj属性,属性值是一个p1对象 也会计数+1 p3.obj = p1 print(sys.getrefcount(p1)) # 当引用被删除时,引用计数-1 del p2 print(sys.getrefcount(p1)) # 从列表中移除,引用计数-1 del list1[0] print(sys.getrefcount(p1)) # 删除对象属性,引用计数-1 del p3.obj print(sys.getrefcount(p1)) # 删除创建时的引用计数,p1对象会被从内存中移除 del p1 # 删除之后,对象不可用 # print(sys.getrefcount(p1)) # 删除对象 class Man(object): # 当对象被创建的时候,回去执行初始化函数 def __init__(self): print('Man类的对象被创建了') def eat(self): print('执行了Man类的eat函数') # 当对象被删除(清除内存)的时候,会执行del函数 def __del__(self): # 可以在对象被删除时,添加一些功能:例如,保存数据... print('Man类的对象被清除了') m = Man() m.eat() m1 = m # 手动删除对象,引用计数-1 del m m1.eat() # 手动删除对象,引用计数-1 为0 对象被清除 del m1 print('.........')
基于python的-内存管理
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.