您的位置:首页 > 编程语言 > Python开发

python的内存管理

2018-02-02 19:44 344 查看
自动管理内存编程语言 例如:object-c python
手动管理内存编程语言 例如:c

Python中是自动管理内存的,实际上是通过"引用计数"的方式来管理内存。当一个对象被创建出来的时候,引用计数为1,当对象被其他对象引用时,引用计数会加1,当对象的引用被删除时,引用计数会-1,当对象的引用计数为0时,该对象所在内存会被系统在合适时间回收

对象在内存无法释放的情况,称之为内存泄露,内存泄露会导致程序占用内存过多,程序出现卡顿的情况,严重情况可能会导致内存崩溃,程序结束或者闪退。

对象多次删除,导致引用计数过渡减少,在之后的代码中有可能导致该对象不可用

#sys 操作系统的模块
import sys
class People(object):
pass

#当创建一个对象的时候,这个对象的计数为1
p1=People()
#通过这个函数可以查看对象的引用计数
#ps:在这查看的是2,自己创建对象的时候+1,编译程序的时候,解释器+1(不需要我们管理)
number=sys.getrefcount(p1)
print(number)
#当对象被引用的时候,引用计数+1
p2=p1
print(sys.getrefcount(p1))   #输出结果:3
#把对象放入列表中,也会造成计数+1
list1=[p1]
print(sys.getrefcount(p1))   #输出结果:4
#创建对象
p3=People()
#给p3添加obj属性,属性值是一个p1对象,也会计数+1
p3.obj=p1
print(sys.getrefcount(p1))   #输出结果:5

#当引用被删除的时候,引用计数—1
del p2
print(sys.getrefcount(p1))   #输出结果:4

#从列表中移除 引用计数-1
del list1[0]
print(sys.getrefcount(p1))   #输出结果:3

#删除对象属性
del p3.obj                   #输出结果:2
print(sys.getrefcount(p1))
#删除创建时的引用计数,p1对象会被从内存中移除
# del p1
#删除之后,对象不可用
print(sys.getrefcount(p1))   #输出结果:NameError: name 'p1' is not defined

#删除对象
class Man(object):
# 当对象被创建的时候,会执行这个函数
def __init__(self):
print('Man类的对象被创建了')

def eat(self):
print('执行了Man类的eat函数')
#当对象被删除的时候,会执行这个函数
def __del__(self):
#可以在对象被删除时,添加一些功能,例如:保存数据....
print('Man类的对象被删除了')

#创建对象时,相当于开辟了一片内存空间,p1代表指针,指向这个内存空间,此时,内存空间被引用一次,计数器的值为1
m=Man()
m.eat()
#当m1=m时,代表指针m1也指向m原来的内存空间,计数器加1,为2
m1=m
#手动删除对象,将指向内存的m删除,引用计数-1 此时只剩下m1指针指向那片内存空间,引用计数为1
# del m

m1.eat()
#手动删除对象,引用计数-1  为0 对象被清除
# del m1

print('......')

# -*- coding: utf-8 -*-

class People(object):

def __del__(self):

print(self)
print('People对象被移除了')

import sys
p1 = People()
p2 = People()
# 循环引用
# 对象A引用对象B,对象B引用对象A,如果对象A想要释放,必须等到对象B先释放,对象B想要释放,必须等到对象A先释放,最后导致两个都释放不掉,内存泄露
# p1引用了p2
p1.obj = p2
# p2引用了p1
p2.obj = p1
number=sys.getrefcount(p1)
print(number)
# 解决循环引用:在使用完毕之后手动删除一次引用
del p1.obj
number=sys.getrefcount(p2)
print(number)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: