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

转载 2018年04月16日 18:44:11

一、PHP 垃圾回收机制(Garbage Collector 简称GC)

在PHP中,没有任何变量指向这个对象时,这个对象就成为垃圾。PHP会将其在内存中销毁;这是PHP的GC垃圾处理机制,防止内存溢出

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

二、__destruct /unset

__destruct() 析构函数,是在垃圾对象被回收时执行。 

unset 销毁的是指向对象的变量,而不是这个对象。

三、 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尽量做到, 一次定位就能查找分配.

JVM——内存管理和垃圾回收

GC   何为GC? Java与C语言相比的一个优势是,可以通过自己的JVM自动分配和回收内存空间。垃圾回收机制是由垃圾收集器Garbage Collection GC来实现的,GC是后台的守护进程...
  • SEU_Calvin
  • SEU_Calvin
  • 2016年07月12日 21:05
  • 15822

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

从Java平台的逻辑结构上来看,我们可以从下图来了解JVM:从上图能清晰看到Java平台包含的各个逻辑模块,也能了解到JDK与JRE的区别对于JVM自身的物理结构,我们可以从下图鸟瞰一下:对于JVM的...
  • u011225629
  • u011225629
  • 2015年10月09日 15:06
  • 5565

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

一、PHP 垃圾回收机制(Garbage Collector 简称GC) 在PHP中,没有任何变量指向这个对象时,这个对象就成为垃圾。PHP会将其在内存中销毁;这是PHP的GC垃圾处理机制,防止内存...
  • Wss0130
  • Wss0130
  • 2016年04月01日 11:07
  • 3408

操作系统的进程、多线程、内存管理、垃圾回收、以及缓冲等方面

一、作业、进程、线程、管程各自的概念? 作业:用户在一次解题或一个事物处理过程中要求计算机系统所做的工作集合,包括用户程序、所需数据、空海命令。 进程:一个程序在一个数据集合上的一次运行过程。 线程:...
  • quanzhan6982
  • quanzhan6982
  • 2017年04月15日 09:49
  • 388

面试准备--java垃圾回收机制、内存管理

一、垃圾回收机制    Java的垃圾回收机制是Java虚拟机提供的能力,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间。垃圾回收回收的是无任何引用的对象占据的内存空间而不是对...
  • wxf540886047
  • wxf540886047
  • 2015年08月09日 16:01
  • 1035

Cocos2d-x 3.0 内存管理机制

在C++中,动态内存分配是一把双刃剑,一方面,直接访问内存地址提高了应用程序的性能,与使用内存的灵活性;另一方面,由于程序没有正确地分配与释放造成的例如野指针,重复释放,内存泄漏等问题又严重影响着应用...
  • vinrex
  • vinrex
  • 2014年10月16日 10:42
  • 5933

面试总结:java程序执行过程 + JVM内存管理 + GC垃圾回收机制

java程序执行过程 +JVM内存管理 + GC垃圾回收机制1、Java程序执行过程一个java程序的编译和执行过程如下: .java ——编译——> .class 类加载器负责加载各个字节码文件(....
  • u010429424
  • u010429424
  • 2017年08月17日 19:15
  • 1594

PHP5和PHP7的垃圾回收机制有什么不同

php5和php7的垃圾回收机制都是利用引用计数我们先来看看什么叫做引用计数:由于PHP是用C来写的,C里面有一种东西叫做结构体,我们PHP的变量在C中就是用这种方式存储的每个PHP的变量都存在于一个...
  • yangxuesong5555
  • yangxuesong5555
  • 2018年03月01日 20:57
  • 374

Java自动内存管理机制(三) 对象、引用

垃圾收集器与内存分配策略 哪些内存需要回收? 什么时候回收? 如何回收?...
  • u012440687
  • u012440687
  • 2016年07月25日 20:24
  • 344

PHP垃圾回收机制之回收周期

回收周期(Collecting Cycles) ¶ 传统上,像以前的 php 用到的引用计数内存机制,无法处理循环的引用内存泄漏。然而 5.3.0 PHP 使用文章» 引用计数系统中的同步周期回收(...
  • lhbeggar
  • lhbeggar
  • 2015年10月26日 16:06
  • 756
收藏助手
不良信息举报
您举报文章:php垃圾回收和内存管理机制
举报原因:
原因补充:

(最多只允许输入30个字)