Chinaunix首页 | 论坛 | 博客
  • 博客访问: 138371
  • 博文数量: 20
  • 博客积分: 551
  • 博客等级: 下士
  • 技术积分: 260
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-28 15:55
文章分类

全部博文(20)

文章存档

2012年(12)

2011年(8)

分类: C/C++

2011-12-19 18:15:34

内存数据段和堆内存数据段和堆

堆的末端有一个称为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 。好了到此就暂时先告一段落吧。

阅读(2170) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~