-
Notifications
You must be signed in to change notification settings - Fork 496
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
获取 App 内存不准 #5
Comments
@ifelseboyxx 你是和 Debug Navigator 中的内存比较么,这个问题我之前也发现了,用代码统计出来的内存会比 Xcode 的内存要多几十 MB |
那这个问题有解决吗? |
@ifelseboyxx @PrinceMarko 我在一台越狱的设备上使用 top 命令查看进程的使用内存,发现上述代码与 top 命令拿到的 RSIZE 是一致的,我测试的数据两者都是 74 MB,至于为什么会和 Debug Gauge 的 RAM 值少几十 MB,应该是 Debug Gauge 采集到内存值少统计了一些数据,具体可以参考这篇文章
至于上述代码通过 |
用resident_size这种方式取出来的值,当不断新增malloc时(不要free掉),resident_size会达到一个最大值,然后会降下来一些;继续malloc,resident_size会继续增长,然后下降。。。 总之就是会有一个峰值,后面的值就与实际malloc的值不匹配了,小很多,峰值会记录在resident_size_max变量中。 |
@simpleease 能贴出你的测试代码么?问题是 malloc 到一定程度后 resident_size 到一个拐点后就递减了,那有与 Debug Gauge 和 Instruments 的值对比么? |
@aozhimin 测试的demo可以查看这个:https://github.com/simpleease/MemoryTest |
@simpleease 多谢提供 Demo,我这边测试了下,通过 |
@aozhimin 嗯,尝试过分析原因,由于iOS没有换页系统,猜测是不是苹果的一些优化策略,对一些只是初始化后面不再使用的相似内存会unload调,只是用了某个索引表来记录。 |
@simpleease 下图是 Allocations 和 VM Tracker 的走势 |
@simpleease 今天又去验证了一下,测试机器 iPhone 7 ,OS 11.1.2(15B202),使用 Instruments 的 Activity Monitor 模板去跑测试项目,在 Live Processes 一栏中有所有的存活的进程,其中有一列 Activity Monitor 的截图 API 对应的输出
关于为什么到峰值会有一点下降,通过 VM Tracker 的数据的比对:
|
@aozhimin VM Tracker中的Swapped Size后面不为0,怎么解释呢? |
@simpleease 这个我也注意到了,但是比较老的文档都表示 iOS 没有交换空间的实现,也没有公开的文档显示 iOS 新增了这一特性,但是 VM Tracker 的 Swapped Size 确实会在内存快速增长到一定值后,它也会从原来的初始值 0 随之增长,而且 Instrument-VMTracker 中也没提及 Swapped Size 列,所以有可能是新加的特性,但是确实找不到证据来证明。 |
用phys_footprint就和xcode显示的内存一致了 |
@feel2d phys_footprint和code的显示接近, 变化趋势一致. |
@kojiyijian ,我之前debug看的时候,xcode显示和自己log的基本很一致,太详细的再没有研究。你说的“不同阶段统计值和xocde显示值的误差也不一样“, 不同阶段是指?另外,phys_footprint 是几部分内存之和,Jetsam 和webcore好像都用了, http://newosxbook.com/articles/MemoryPressure.html |
楼主还是没解释清楚为什么代码统计的内存会变大,能在详细解释下吗?不胜感激 |
@yinjining 如 @onerobot 所说,resident_size(驻留内存)确实无法反映应用的真实物理内存,而且 Xcode 的 Debug Gauge 使用的应该是
XNU 代码 中 Jetsam 中判断应用内存是否过大使用的也是 |
或许是resident_size不包括cleanMemory |
task_vm_info_data_t info; |
可以查看下这个form https://developer.apple.com/forums/thread/105088 , Apple 的工程师提供了建议,建议使用 phys_footprint |
这个拿到的值和 Xcode 上的不一致啊,多了30-40MB 左右
The text was updated successfully, but these errors were encountered: