基于python的-内存管理

# -*- 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('.........')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章