1.内存泄漏的定义
2、内存泄漏的后果
程序运行后置之不理,并且随着时间的流失消耗越来越多的内存(比如服务器上的后台任务,尤其是嵌入式系统中的后台任务,这些任务可能被运行后很多年内都置之不理);
新的内存被频繁地分配,比如当显示电脑游戏或动画视频画面时;
程序能够请求未被释放的内存(比如共享内存),甚至是在程序终止的时候;
泄漏在操作系统内部发生;
泄漏在系统关键驱动中发生;
内存非常有限,比如在嵌入式系统或便携设备中;
当运行于一个终止时内存并不自动释放的操作系统(比如AmigaOS)之上,而且一旦丢失只能通过重启来恢复。
3、如何发现内存泄漏
ps-aux
静态分析,包括手动检测和静态工具,是代价最小的方法。
BEAM支持以下平台:
Linuxx86(glibc2.2.4)
Linuxs390/s390x(glibc2.3.3orhigher)
Linux(PowerPC,USS)(glibc2.3.2orhigher)
AIX(4.3.2+)
Window2000以上
或者使用内嵌程序自动检测
2、动态运行检测
实时检测工具主要有valgrind,Rationalpurify等。
1、Valgrind
读写已经释放的内存
读写内存块越界(从前或者从后)
使用还未初始化的变量
将无意义的参数传递给系统调用
内存泄漏
2、Rationalpurify
CC=purifygcc
./purifyplus_setup.sh
purifyg++-gtest3.cpp–otest
./test
4、如何避免内存泄漏
要避免内存泄漏可以总结为以下几点:
2、一遍又一遍的看代码,希望能看出内存泄露的bug
6、代码规模超过千万行,内存从一个模块被传递到另一个或多个,谁知道传递给哪个模块,最后在那里释放的了,反正我保证那个指针指向的数据是好的就行了。由于代码的规模,穷举式的测试根本不可能,只有一遍一遍的看代码,祈祷自己的代码没有内存泄露的问题。
内存碎片
1、什么是内存碎片
内存碎片—描述一个系统中所有的不可用的空闲内存;这些资源之所以仍然未被使用,是因为负责分配内存的分配器使这些内存无法使用。这一问题通常都会发生,原因在于空闲内存以小而不连续方式出现在不同的位置。由于分配方法决定内存碎片是否是一个问题,因此内存分配器在保证空闲资源可用性方面扮演着重要的角色。
2、内存碎片产生的原因
外部碎片的产生是当已分配内存块之间出现未被使用的差额时,就会产生外部碎片。例如,一个应用程序分配三个连续的内存块,然后使中间的一个内存块空闲。内存分配程序可以重新使用中间内存块供将来进行分配,但不太可能分配的块正好与全部空闲内存一样大。倘若在运行期间,,内存分配程序不改变其实现法与四舍五入策略,则额外开销和内部碎片在整个系统寿命期间保持不变。虽然额外开销和内部碎片会浪费内存,因此是不可取的,但外部碎片才是嵌入系统开发人员真正的敌人,造成系统失效的正是分配问题。
3、内存碎片的弊端与优点
缺点:
大量的内存碎片会使系统缓慢,原因在于虚拟内存的使用会使内存与硬盘之间的数据交换称为系统
优点:
减少内存碎片,提高分配速度,便于内存管理,防止内存泄露
4、如何避免内存碎片的产生
2,分配内存和释放的内存尽量在同一个函数中
4,使用内存池来减少使用堆内存引起的内存碎片
5、尽可能少地申请空间。
6尽量少使用堆上的内存空间~
让我们从自身的禁锢中放心地飞出去,重新审视自己,