美文网首页
内存管理

内存管理

作者: one丨 | 来源:发表于2019-01-14 18:00 被阅读0次

    内存管理

    1.数据的存储
    • 内存分为栈区间和堆区间;从底层来看,栈区间的内存的开辟和释放是系统自动管理的,堆区间的内存是由程序员通过代码开辟(malloc)和释放的

    从python语言角度,栈区间的内存的开辟和释放是系统自动管理的,堆区间的内存关键也已经封装好了, 程序员也不需要写代码来开辟空间和释放空间

    a.python中变量本身是存在栈区间的,函数调用过程是在栈区间; 对象都是存在堆区间(python中所有数据都是对象)
    b.变量赋值过程:先堆区间开辟空间将数据存起来, 然将数据对应的地址存到栈区间的变量中。
             数字和字符串比较特殊,赋值的时候不会直接开辟空间,而是先检测之前有没有存储过这个数据,
             如果有就用之前的数据的地址
    
    2.内存释放(垃圾回收机制)原理:

    python中的每个对象都有一个属性叫'引用计数',表示当前对象的引用的个数。判断一个对象是否销毁就看对象的引用计数是否为0;
    为0的就销毁,不为0的就不销毁。

    getrefcount函数:
    getrefcount(对象)  -> 获取对象的引用计数
    
    from sys import getrefcount
    
    
    def main():
        list1 = [1, 2]
        print(getrefcount(list1))      # 2
    
        # 使用不同的变量存对象地址会增加引用计数
        list2 = list1
        print(getrefcount(list1))     # 3
    
        [1, list1]
        print(getrefcount(list1))    # 3
    
        # def func1(obj):
        #     print(getrefcount(list1))
        #
        # func1(list1)
    
        print(getrefcount(list1))
    
        list1 = []
        print(getrefcount(list2))   # 2
    
        del list2
        # print(getrefcount(list2))   # UnboundLocalError
    
    
        # def getrefcount(obj):
        #     obj = list1
        #     获取obj的引用计数
    
        bullets = [{'x': 10, 'y': 20}, {'x': 30, 'y': 10}, {'x': 100, 'y': 200}]
        del bullets[2]
    
        bullets.pop(0)
    
    if __name__ == '__main__':
        main()
    
    
    image.png

    相关文章

      网友评论

          本文标题:内存管理

          本文链接:https://www.haomeiwen.com/subject/nqpjdqtx.html