前言
内存这边一直都是让人头大的部分,而 “内存溢出” 和 “内存泄露” 一直都被我搞混。这里将形象的解释什么是 “内存溢出” 和 “内存泄漏” 以及区别。
简述
内存溢出:当程序申请不到足够的内存时,就会发生内存溢出。换句话说当给一个整型 int 赋值超出 int 数值范围时,就是内存溢出。
内存泄漏:当程序中已被使用的空间无法被释放,久而久之会造成堆积,最终导致的结果就是内存溢出了。
理解
内存溢出 out of memory
更浅显的理解,当程序运行时假设需要 150mb 的内存,但是实际内存或者空闲空间只有 100mb ,此时就是所谓的内存溢出。设备内存不足以满足程序的内存需求,这就是内存溢出。
往往在软件开发中会进行资源的压缩,尤其是游戏开发中,最常见的就是模型使用低模,贴图以及 UI 进行压缩。这些都是为了防止程序运行所要请求的内存超出了设备所能提供的内存空间,而造成的内存溢出。
例如数据栈,满的时候进行入栈,则称为上溢;空的时候出栈,则为下溢。
造成内存溢出的原因一般有:
- 申请过多内存资源。
- 已使用资源没有及时回收。
- 大量的内存申请。
内存泄漏 memory leak
内存泄漏浅显的解释就是,当程序中某一块内存的资源已被使用完毕,但是没有及时或者无法将此内存空间释放。这就致使接下来后面的资源不能使用这块空间,可能需要进一步申请内存空间。假若这种情况一直出现,最终会导致系统没有足够的内存分配给程序,也即是内存溢出了。
因此而言,内存泄漏的最终结果就是内存溢出。
而往往造成内存泄漏的原因一般有:
- 静态数据使用过多。
- 没有及时回收释放无用的内存资源。
- 一些参数内存值设定过小。
- 第三方bug
解决方案
这里就讲内存溢出和内存泄漏的解决方案统一列举:(不全)
- 尽量减少使用 new
- 程序的固定资源可以压缩,或者分包形式存储,加载时动态加载。
- 注意静态的使用,静态变量尽可能是内存占用少的数据类型或资源。
- 大量重复生成的对象,使用对象池(数据池)。
- 使用较好的测试工具,及时发现问题所在。
- 及时回收以使用完毕的内存资源。
腾讯的测试工具——Cube 听说比较好用,回头我评测一下。