zoukankan      html  css  js  c++  java
  • PythonStudy——内存管理机制 Memory management mechanism

    一、变量与对象

    关系图如下:

    1、变量:通过变量指针引用对象

      变量指针指向具体对象的内存空间,取对象的值。

    2、对象:类型已知,每个对象都包含一个头部信息(头部信息:类型标识符引用计数器

    注意:

      变量名没有类型,类型属于对象(因为变量引用对象,所以类型随对象),变量引用什么类型的对象,变量就是什么类型的。

    eg:

       在Python37解释器中:

    In [32]: var1=object
    In [33]: var2=var1
    
    In [34]: id(var1)
    Out[34]: 139697863383968
    
    In [35]: id(var2)
    Out[35]: 139697863383968

        在JetBrain中:

    var1 = object
    var2 = var1
    
    print(id(var1))
    print(id(var2))

        输出: 

     

      PS:id()是python的内置函数,用于返回对象的身份,即对象的内存地址

    在内存中:

       示例1:

        示例2:

    示例3:

    In [39]: a=123 In [40]: b=a In [41]: id(a) Out[41]: 23242832 In [42]: id(b) Out[42]: 23242832 In [43]: a=456 In [44]: id(a) Out[44]: 33166408 In [45]: id(b) Out[45]: 23242832

    3、引用所指判断

      通过  is  进行引用所指判断,is是用来判断两个引用所指的对象是否相同。

    示例:

     整数:

    In [46]: a=1
    In [47]: b=1
    In [48]: print(a is b)
    True

    短字符串:

    In [49]: c="good"
    In [50]: d="good"
    In [51]: print(c is d)
    True

    长字符串:

    In [52]: e="very good"
    In [53]: f="very good"
    In [54]: print(e is f)
    False

    列表:

    In [55]: g=[]
    In [56]: h=[]
    In [57]: print(g is h)
    False

    由运行结果可知:

      1、Python缓存了整数短字符串,因此每个对象在内存中只存有一份,引用所指对象就是相同的,即使使用赋值语句,也只是创造新的引用(在内存的栈区内创建新的内存空间),而不是对象本身(对象依然存在于堆区),id相同

      2、Python没有缓存长字符串列表及其他对象,即使由多个相同的对象,可以使用赋值语句创建出新的对象,id不同

    查看id()的源码:

    def id(* args,** kwargs):#真正的签名未知
        “””
         返回对象的标识。
        
         这保证在同时存在的对象中是唯一的。
         (CPython使用对象的内存地址。)
        “””
         通过

    在 Java中获取对象的内存地址方法 如下:

     二、内存池

    Python中有分为大内存和小内存:(256K为界限分大小内存)

    1、大内存使用malloc进行分配

    2、小内存使用内存池进行分配

    3、Python的内存池(金字塔)

      第3层:最上层,用户对Python对象的直接操作

      第1层和第2层:内存池,有Python的接口函数PyMem_Malloc实现-----若请求分配的内存在1~256字节之间就使用内存池管理系统进行分配,调用malloc函数分配内存,但是每次只会分配一块大小为256K的大块内存,不会调用free函数释放内存,将该内存块留在内存池中以便下次使用。

      第0层:大内存-----若请求分配的内存大于256K,malloc函数分配内存,free函数释放内存。

      第-1-2层:操作系统进行操作

      

         

     

     借鉴:https://www.cnblogs.com/geaozhang/p/7111961.html

     

  • 相关阅读:
    leetcode 228. Summary Ranges ---------- java
    leetcode 227. Basic Calculator II ---------- java
    leetcode 225. Implement Stack using Queues 利用队列构建栈 ---------- java
    leetcode 224. Basic Calculator ---------- java
    leetcode 223. Rectangle Area 计算面积---------- java
    leetcode 222. Count Complete Tree Nodes 统计节点个数---------- java
    leetcode 链表题总结
    leetcode 221. Maximal Square 求一个数组中由1组成的最大的正方形面积 ---------- java
    React + Node 单页应用「三」API 设计 & 项目部署
    React + Node 单页应用「二」OAuth 2.0 授权认证 & GitHub 授权实践
  • 原文地址:https://www.cnblogs.com/tingguoguoyo/p/10698204.html
Copyright © 2011-2022 走看看