php垃圾回收和内存管理机制

1,php垃圾回收机制(Garbage Collerctor 简称GC)
php中,没有任何变量指向这个对象时,这个对象就成为了垃圾,PHP会将其在内存中销毁,这是php的GC垃圾处理机制,防止内存溢出

当一个php线程结束时,当前占用的所有内存空间都会被销毁,当前程序中所有对象同时被销毁.GC进程一般都跟着每一个session而开始运行
gc目的是为了在session文件过期以后自动销毁删除这些文件。

2,__destruct / unset
__destruct() 析构函数,是在垃圾对象被回收时执行。
unset 销毁的是指对象的变量,而不是这个对象

3,Session 与 Php垃圾回收机制
由于PHP的工作机制,他并没有一个daemon进程来定期的扫描session信息并判断其是否失效,当一个有效的请求发生时,php会根据全局变量
session.gc_probability和session.gc_divisor的值,来决定是否启用一个GC,在默认情况下,session.gc_probability=1,
session.gc_divisor=100 也就是说1%的可能性启动GC(也就是说100个请求中只有一个GC会伴随100个中的某个请求而启动)

php垃圾回收机制的工作就是扫描所有的session信息,用当前时候减去session最后修改时间,同session.gc_maxlifetime参数进行比较,如果生存时间超过
gc_maxlifetime(默认24分钟),就将该session删除,但是,如果你web服务器有多个站点,多个站点时,GC处理session可能会出现意想不到的结果,原因
就是:GC在工作时,并不会区分不同站点的session
那么这个时候怎么解决呢?
1,修改session.save_path,或使用session_save_path()让每个站点的session保存到一个专用的目录
2,提供GC的启动率,自然,php垃圾回收机制的启动效率提高,系统的性能也会相应减低,不推荐
3,在代码中判断当前session的生存时间,利用session_destroy()删除

php的内存管理,分为两大部分,第一部分是php自身的内存管理,这部分主要内容就是引用计数,写时复制,等等面向应用的层面的管理,
而第二部分是zend_alloc中描写的关于php自身的内存管理,包括它是如何管理可用内存,如何分配内存等。

zend memory manager,以下简称Zend MM, 是PHP中内存管理的逻辑,其中一个关键数据结构:zend_mm_heap
zend MM把内存分为小块内存和大块内存两种,区别对待,对于小块内存,这部分是最常用的所以追求高性能,而对于大块内存,则追求的是稳妥,尽量避免内存浪费。
所以,对于小块内存,PHp还引入了cache机制,zend MM 希望通过cache尽量做到,一次定位就能查找分配

猜你喜欢

转载自blog.csdn.net/a369405354/article/details/79386877