PHP垃圾回收机制防止内存溢出

PHP语言同其他语言一样,具有垃圾回收机制。那么今天我们要为大家讲解的内容就是关于PHP垃圾回收机制的相关问题。希望对大家有所帮助。

一、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=1session.gc_divisor =100

也就是说有1%的可能性启动GC(也就是说100个请求中只有1个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()删除。

 

 

 

延伸阅读:

浅谈PHP5中垃圾回收算法(Garbage Collection)的演化

PHP session过期机制和配置

转载于:https://www.cnblogs.com/52php/p/5666505.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ThreadLocal 是一个线程局部变量,它提供了线程独立的变量副本,每个线程访问该变量时都会获得一份独立的副本。通过使用 ThreadLocal 可以有效地避免多线程环境下的数据竞争和同步问题。 然而,如果在使用 ThreadLocal 时不注意及时清理它所持有的对象,就有可能导致内存泄漏和内存溢出的问题。在长时间运行的应用中,如果不手动删除对应线程的 ThreadLocal 变量,那么 ThreadLocalMap 中的 Entry 的 key 对象将无法被回收,从而导致内存泄漏。 为了避免内存泄漏,我们应该在不再使用 ThreadLocal 变量的时候,手动调用其 remove() 方法来清理对应线程的 ThreadLocal 变量。一种常见的做法是使用 try-finally 块来确保在使用完 ThreadLocal 后进行清理: ```java ThreadLocal<MyObject> myThreadLocal = new ThreadLocal<>(); try { // 使用 myThreadLocal } finally { myThreadLocal.remove(); } ``` 另外,还可以通过使用 Java 8 引入的新特性 `java.lang.ref.Cleaner` 来实现更加灵活的资源清理。Cleaner 可以在对象被垃圾回收之前执行指定的清理操作,可以用于自动清理 ThreadLocal 中的数据,避免手动调用 remove() 方法。但需要注意的是,Cleaner 的使用需要谨慎,需要了解清理操作的时机和范围,以避免潜在的问题。 总结起来,为了防止内存溢出,使用 ThreadLocal 时需要及时清理对应的 ThreadLocal 变量,可以使用 try-finally 块或 Cleaner 来实现清理操作,确保不再使用 ThreadLocal 变量时及时清理,避免内存泄漏问题的发生。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值