python的内存管理
2018-02-02 19:44
344 查看
自动管理内存编程语言 例如:object-c python
手动管理内存编程语言 例如:c
Python中是自动管理内存的,实际上是通过"引用计数"的方式来管理内存。当一个对象被创建出来的时候,引用计数为1,当对象被其他对象引用时,引用计数会加1,当对象的引用被删除时,引用计数会-1,当对象的引用计数为0时,该对象所在内存会被系统在合适时间回收
对象在内存无法释放的情况,称之为内存泄露,内存泄露会导致程序占用内存过多,程序出现卡顿的情况,严重情况可能会导致内存崩溃,程序结束或者闪退。
对象多次删除,导致引用计数过渡减少,在之后的代码中有可能导致该对象不可用
手动管理内存编程语言 例如: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)
相关文章推荐
- Python的内存管理 小理解
- python内存管理
- python --内存管理
- python的内存管理机制
- 【python】理解python里的赋值、引用、拷贝及作用域、内存管理、垃圾回收
- 《python源码剖析》笔记 pythonm内存管理机制
- python中的内存管理
- python的内存管理
- Python的内存管理
- Python中的内存管理【转载】
- Python内存管理(二 arena和缓存池)
- Python--内存管理
- [Python源码学习]之内存管理
- python学习笔记10(Python的内存管理)
- Python 源码学习之内存管理 -- (转)
- [Python]内存管理
- Python Study (06)内存管理GC
- Python基础——内存管理
- python和java的区别(python内存管理)
- python的内存管理机制