python内存池

分两层说清楚:pymalloc 三层内存池、常量缓存池,启动行为不一样

1. pymalloc(arena/pool/block 小块内存池)

程序刚启动时是空的,不会提前预分配内存

  • 刚执行脚本,还没创建任何对象:没有 Arena、没有 Pool,没向操作系统申请任何堆内存。
  • 只有当你第一次创建≤512字节的小对象(int、空对象、短字符串等),CPython 才会调用系统 malloc 申请一块 4MB Arena,再拆分 Pool/Block。
  • 空闲的 Block 会缓存下来反复复用;只有整块 Arena 全部空闲,才会释放还给系统。

简单记:用时才分配,启动不预装。

2. 内置常量缓存池,进程一启动就直接存在

这部分程序刚跑就自带,提前初始化完成:

  1. 小整数池 [-5, 256]
    解释器初始化阶段直接创建全部整数对象,全程常驻内存,从启动到结束不销毁。
  2. 字符串驻留池
    全局哈希表启动即创建,运行中动态存入字符串,但容器本身开机就有。
  3. 内置容器 free_list 缓存链表
    list、dict、tuple 等的空闲对象链表,启动时初始化空链表,创建销毁对象后才会填充复用。

总结

  1. 负责业务对象分配的三层内存池(arena/pool):启动没有,用到才创建;
  2. 整数缓存、驻留字符串全局表这类常量池:程序一运行就存在。
posted @ 2026-06-26 13:35  jerry-mengjie  阅读(16)  评论(0)    收藏  举报