PHP内存管理
2018-08-31 10:24:05 14 举报
AI智能生成
PHP内存管理,垃圾回收,内存原理等
作者其他创作
大纲/内容
写时复制
发生写时才进行深拷贝
并不是所有的value都可以复制
string
array
垃圾回收
自动内存回收的不是垃圾
垃圾是value不再使用,但是引用还>0,自动回收机制cover不住的
循环引用的场景
垃圾回收器会把可能是垃圾的value收集起来,等达到一定数量之后才会回收
垃圾存在的类型
array
object
其他情况不会出现循环引用
垃圾回收期的判断依据
IS_TYPE_COLLECTABLE
疑问:标志是怎么打上去的
回收算法
垃圾由于成员引用自身导致的,对value的所有成员减1引用计数
引用计数
记录多少个zval指向同一个zend_value,新的zval+1,销毁zval减1,=0可以销毁
不是所有的类型都用引用计数
string
array
object
resource
reference
内存回收时机
zval断开value的指向时,发现refcount=0,直接释放value
修改变量与函数返回时,会断开指向
unset()函数
内存池
malloc,频繁分配、释放内存,产生内存碎片,降低系统性能
zendMM
减少内存分配及释放的次数
控制内存碎片的产生
参考tcmalloc/jemalloc重写
trunk、page、slot结构
slots
提供8,16,24,...3072等size的内存
每种size在一个或者若干个连续的page上分配
释放的内存放入对应尺寸的链表
pages
在trunk上连续分配
用bitmap标记空闲块,加速空闲块的查找
trunks
大于2M直接分配一个trunks
直接向系统要,不走malloc
0 条评论
下一页