-内存泄露初探-

原创 2007年09月29日 21:23:00

某次面试,被问及内存泄露相关事宜,当时瞠目结舌,故现对此话题比较敏感。

(1)WHAT 什么是内存泄露?

 部分内存不在程序的管理范围内了,即脱离了管理。

(2)WHY 内存泄露是怎么产生的?

调用malloc分配内存之后,忘记调用相应的free函数释放它。从而导致废弃内存越来越多,从而可能导致程序或系统崩溃。

(一种解决的简单方法就是使用 alloca 函数来代替 malloc 分配内存,但由于alloca()的生命期只在所调用函数内部,所以当离开调用 alloca 的函数时,它所分配的内存会被自动释放。因此,这并不适用于那些比创建它们/的函数生命期更长的结构。另外可能还有一个可移植性的问题)

(3)HOW 如何检测内存泄露?

观察内存泄露是一个两步骤地过程。首先,使用 swap 命令观察还有多少可用的交换空间:

/usr/sbin/swap -s

total: 17228k bytes allocated + 5396K reserved = 22624K used, 29548K available

在一两分钟内键入该命令三到四次,看看可用的交换区是否在减少。还可以使用其他一些 /usr/bin/*stat 工具 如

netstat, vmstat 等。如果发现不断有内存被分配且从不释放,一个可能的解释就是有个进程出现了内存泄露。

(Redhat Linux 下实际使用:swap命令未发现,netstat命令产生的结果太过复杂,使用 vmstat 命令可以很方便的查出内存使用情况!)

第二个步骤就是确定可疑的进程,看看它是不是该为内存泄露负责。你可能已经知道哪个进程是罪魁祸首,不然可以使用“pa -lu 用户名”命令来显示所有进程的大小,如下所示:

F  S UID PID .....
................

标题为SZ的列就是以页面数表示的进程的大小(如果一定想知道以KB表示的页面的大小,可以使用 pagesize 命令)。同样数次重复这个命令,可以发现任何动态分配内存的进程的大小都在增长。如果一个进程看上去不断地增长而从不缩小,它就有可能出现了内存泄露。一个非常悲哀的现实是,管理动态内存是一项非常困难的编程任务。有些公共领域的X-Windows应用程序因内存泄露而臭名昭著,就像Apple Computer的董事会一样。

相关文章推荐

Android 内存泄露

  • 2015年03月13日 11:52
  • 77KB
  • 下载

android性能优化之内存泄露

  • 2017年10月13日 15:31
  • 2.73MB
  • 下载

HBASE内存泄露读文件失败的问题

2016-12-28 04:04:58,586 INFO  [RS_OPEN_REGION-slave1:16020-2] regionserver.HRegion: Replaying edits ...
  • Yuli_li
  • Yuli_li
  • 2016年12月29日 16:38
  • 979

检查代码内存泄露

  • 2017年10月20日 15:31
  • 559KB
  • 下载

内存泄露检测工具

  • 2013年12月05日 18:04
  • 727KB
  • 下载

Android内存泄露及解决方法总结

1. 概述Java内存泄漏指的是进程中某些对象(垃圾对象)已经没有使用价值了,但是它们却可以直接或间接地引用到gc roots导致无法被GC回收。无用的对象占据着内存空间,使得实际可使用内存变小,形象...

C++内存泄露检测器

  • 2012年11月03日 13:32
  • 66KB
  • 下载

VC内存泄露检查

  • 2013年03月14日 11:19
  • 388KB
  • 下载

Android 性能优化之使用MAT分析内存泄露问题

我们平常在开发Android应用程序的时候,稍有不慎就有可能产生OOM,虽然JAVA有垃圾回收机,但也不能杜绝内存泄露,内存溢出等问题,随着科技的进步,移动设备的内存也越来越大了,但由于Android...

有内存泄露程序

  • 2013年01月03日 14:08
  • 45KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:-内存泄露初探-
举报原因:
原因补充:

(最多只允许输入30个字)