记一次PHP与自动释放池的内存释放的坑

博客讲述了在PHP中遇到的一个内存管理问题,由于遍历数组时频繁调用`localIdentifier`接口,导致大量autorelease对象未及时释放,引发内存峰值。作者通过分析和定位,发现是由于缺少autoreleasepool导致内存积累,最终给出解决方案,提醒开发者在数组遍历中注意添加autoreleasepool以避免类似问题。
摘要由CSDN通过智能技术生成

使用多线程遍历或操作集合对象的时候,务必要注意内存的及时释放,否则一不小心就触发内存峰值而闪退了。

最近新版本发布后,有较多用户反馈闪退;经过部分走访用户初步得出结论是内存闪退,而且和PHPLibrary相关修改有关;

联系用户

联系了部分用户,捞取到较多日志;确定原因基本是内存闪退,发生闪退时浏览器占用了1.3G左右的内存,超过了内存限制而被jetsam杀死;这个不太合理,我们基本不会这样疯狂申请这么大内存而不释放的。

最后发现用户都有一个共性,相册图片都很多。而恰好我们在新版本有个较大的修改为了适配iOS12而全面废弃了ALAssetLibrary,所以怀疑是这里。

分析

给用户打包集成了QAPM后,终于找到问题祸首了,原来是PHP的localIdentifier接口导致的
请在这里填写图片描述

找到PHP接口说明,
请在这里填写图片描述

每次调用localIdentifier会触发一次deep copy字符串,从而分配了内存;但是一个字符串也不可能这么容易导致内存飙涨呢?

定位

原因是我们在数组遍历中,频繁触发了localIdentifier接口的调用,根据ARC说明,不是new,alloc,等创建的对象,不是属于我们管理的,因此该接口返回的是一个autorelease的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值