memory

All posts tagged memory

IOS内存泄露

 

App里的内存泄漏分为两类:

  • Leaked memory: Memory unreferenced by your application that cannot be used again or freed (also detectable by using the Leaks instrument).
  • Abandoned memory: Memory still referenced by your application that has no useful purpose.

利用XCode自带的Instrument,  可以分析出这些内存泄漏。

根据笔者的经验,Leaked memory能分析的是这样的一类内存泄漏:

memAlloc = malloc(100);

当memAlloc没有被释放,此语句再次被执行的时候就会被Instruments的Leak工具检测出来。

麻烦的内存泄漏是Abandoned memory,这类内存一直被缓存,但其实已经没有用了,问题来了,什么是有用,什么是没用呢?

Instrument工具给出的方案是https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/FindingAbandonedMemory.html#//apple_ref/doc/uid/TP40004652-CH80-SW1, 简单来说,用 Mark Generation 的方式,每次Mark的时候,都会生存一个内存快照,然后比较两个快照有什么不同。可想而知,这个是对稍微复杂点的场景来说,还是太不方便。

对于游戏来说,主要的消耗内存的就是纹理和音视频资源了,这一块除了设计好资源管理外,需要提供一个直观方便的dump info,随时能够查看资源分配和释放的情况。然后配合Instrument的工具,也足够使用了。

更高级的内存泄漏,依然是利去hook底层的内存分配和释放函数,IOS方面的内存泄漏可以参考:

https://wereadteam.github.io/2016/02/22/MLeaksFinder/

 

(1)malloc: *** error: incorrect checksum for freed object – object was probably modified after being freed

这个可以借助Xcode里的Product->Scheme->Edit Scheme,把Diagnostics里的Enable Zombie Objects 和Enable Address Sanitizer选项勾上,往往能更迅速定位问题。

(2)内存应该尽可能控制在150M以下,收到Memory Warning有的时候已经晚了。

(3)对各种类型IPad,IPhone等做好测试,有些BUG可能发生在特定机型上。

 

 

最近由于机器原因,服务器开发迁移到了一个新的环境。

然而以前运行很好的服务突然崩溃,出现如下错误:

Program terminated with signal SIGKILL, Killed.
The program no longer exists.

(gdb) bt
No stack.

然后,

cd /var/log
more messages | tail

果然,最后几条显示:

Sep 22 10:06:11 localhost kernel: __alloc_pages: 0-order allocation failed (gfp=0x1d2/0)

显然,应该是内存分配引起的问题。查看swap,崩溃阶段为0,更加印证了这一点。

查看程序的相关配置,启动了太多的内容,导致内存分配失败,而程序中又没有捕捉这些错误。去掉一些内容后,程序又恢复好了。