生产环境 PHP 8.2 内存突增通常由 opcache.jit_buffer_size 配置过大或 JIT 在不适合的场景启用导致,最推荐的处理方向是评估业务类型后关闭 JIT 或调小缓冲区。适用场景为 IO 密集型 Web 应用,风险边界是 CPU 密集型计算任务可能失去加速效果。
先说结论:PHP 8.2 的 JIT 机制会预留固定内存用于存储机器码,多数 Web 项目开启 JIT 只会增加内存占用而无明显性能收益。
- 先定位:通过 opcache_get_status() 确认 JIT 状态与缓冲区大小
- 先做:将 opcache.jit 设置为 off 或调小 opcache.jit_buffer_size
- 再验证:观察进程 RSS 内存变化与接口响应耗时
命令速用版
php -r "var_dump(opcache_get_status());"php -i | grep opcache.jit为什么会这样
JIT 编译需要预先分配一块连续内存用于存放生成的机器码,这块内存在 PHP 进程启动时就会被占用。
PHP 官方 RFC 文档指出 JIT 主要针对 CPU 密集型任务优化,而典型 Web 请求多为 IO 等待,开启 JIT 后 opcache.jit_buffer_size 设定的内存会被常驻进程占用,导致 RSS 突增。
分步处理
第一步:检查当前 JIT 配置。
php -i | grep -E "opcache.jit|opcache.jit_buffer_size"第二步:修改 php.ini 或池配置。
opcache.jit=off
opcache.jit_buffer_size=0第三步:重启 PHP-FPM 服务使配置生效。
systemctl restart php8.2-fpm回滚提醒:修改前备份 php.ini 文件,若业务包含大量数学计算需保留 JIT 功能。
怎么验证是否生效
使用系统命令查看进程内存占用是否回落,并通过脚本确认 JIT 状态。
ps aux | grep php-fpm | awk '{print $6}'检查 opcache 状态中 jit_enabled 字段是否为 false。
常见坑
不要将 opcache.jit_buffer_size 设置得过大,这会导致每个 PHP-FPM 子进程额外占用该数值内存。
公开资料中没有看到可靠的量化数据证明 JIT 能提升 Laravel 或 WordPress 等框架的 QPS,盲目开启只会增加成本。
常见问题
JIT 关闭后会影响网站速度吗?
对于绝大多数 Web 业务不会感知到速度变化,因为瓶颈通常在数据库或网络 IO。
内存占用突增是内存泄漏吗?
通常不是泄漏,而是 JIT 缓冲区分配导致的常驻内存增加,重启服务后若依旧高则确认为配置问题。
PHP 8.2 默认开启 JIT 吗?
默认配置通常不开启或设置为保守值,突增往往源于人为修改配置或升级后的默认值变化。
参考来源
- PHP Official Documentation, opcache.configuration, https://www.php.net/manual/en/opcache.configuration.php
- PHP Wiki, RFC: JIT, https://wiki.php.net/rfc/jit