全部博文(254)
分类: C/C++
2013-02-19 16:50:33
原文地址:内存数据段和堆内存数据、内存泄漏 作者:goodspeed_517
内存数据段和堆内存数据段和堆
堆的末端有一个称为Break的指针来标识。当对管理器需要更多的内存时,他可以通过系统调用brk,sbrk来移动Break指针,一般情况下不必显示的调用brk,如果分配的内存容量很大,brk最终会自动调用。用于管理内存的调用是:
malloc和free——从堆中获得内存以及把内存返回给堆。
brk和sbrk——调整数据段的大小至一个绝对值(通过某个增量);
waring:你的程序可能无法同时调用malloc()和brk();如果你使用的malloc,malloc希望当你调用brk和sbrk时;它具有一定的控制权。由于sbrk向进程提供了唯一的方法将数据段内存返回给系统内核,所以使用malloc,就有效的防止了程序的数据段缩小的可能性。想获得以后能返回给系统的内核的内存,可以使用mmap系统调用来映射/dev/zero文件。需要返回给这中内存时,可以使
用mmap系统调用。
每次使用malloc分配内存时,注意在以后要调用相应的free来释放它。如果不知道如何调用free()与先前的malloc()相对应,那么很可能已经造成了内存的泄露。一种简单的方法就是在可能的时候用alloc()分配动态内存,以避免上述情况的发生。当离开调用alloc()的函数时,他所分配的内存会被自动释放,有些人不提倡使用alloc(),因为他并不是一种可移植的方法。如果处理器在硬件上是不支持堆栈,alloc()就很难高效的实现。
如何检测内存泄露的方法:
观察内存泄露是两步骤的过程:
1.使用swap命令观察好有多少可用的交换空间:/user/sbin/swap -s
total;17228k bytes allocated+5396k reserved = 22624k used, 29548 k avaliable
(共计:17228k 已分配 +5396k 用于保留 = 2262k 已用,19548 可用)
在一两分钟内键入该命令三到四次,看看可用的交换区是否在减少,还可以使用其他的/user/bin/*stat 工具如:netstat、vmstat等。如果发现不断有内存没被释放,可能的解释就是有进程出现了内存泄露。
2.确定可疑的进程,看看它是不是该为内存泄露负责。你可能知道哪个进程是罪魁祸首,不然可以使用“ps -lu username” 命令来显示所有进程的大小。如下所示:
F |
S |
UID |
PID |
PPID |
C |
PRI |
Ni |
ADDR |
ZS |
WCHAN |
TTY |
TIME |
COMD |
8 |
S |
5303 |
226 |
224 |
80 |
1 |
20 |
Ff38f000 |
199 |
Ff38fld0 |
Pts/3 |
0:01 |
csh |
8 |
O |
5303 |
921 |
226 |
29 |
1 |
20 |
Ff38c000 |
143 |
|
Pts/3 |
0:00 |
ps |
标题为zs的列就是以页面数表示的进程的大小同样的方法执行多次命令,会发现任何动态分配内存的进程的大小都在增长,如果某一个只增不减,那么是什么样的结果就不言而喻了;你懂的。对与malloc函数库中在速度上做了 一些优化,有些重视空间的存分利用,另外一些则是希望对调试有所帮助,键入命令: man -s 3c malloc 。好了到此就暂时先告一段落吧。