-内存泄露初探-

原创 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的董事会一样。

Linux下几款C++程序中的内存泄露检查工具

Linux下编写C或者C++程序,有很多工具,但是主要编译器仍然是gcc和g++。最近用到STL中的List编程,为了检测写的代码是否会发现内存泄漏,了解了一下相关的知识。所有使用动态内存分配(dyn...
  • gatieme
  • gatieme
  • 2016年07月19日 21:56
  • 11442

分析和解决JAVA 内存泄露的实战例子

这几天,一直在为Java的“内存泄露”问题纠结。Java应用程序占用的内存在不断的、有规律的上涨,最终超过了监控阈值。福尔摩 斯不得不出手了! 分析内存泄露的一般步骤      ...
  • bigtree_3721
  • bigtree_3721
  • 2016年01月20日 18:21
  • 30953

JAVA 内存泄露详解(原因、例子及解决)

Java中的内存泄露,广义并通俗的说,就是:不再会被使用的对象的内存不能被回收,就是内存泄露。 Java中的内存泄露与C++中的表现有所不同。 在C++中,所有被分配了内存的对象,不再...
  • anxpp
  • anxpp
  • 2016年05月05日 20:24
  • 37693

如何检查内存泄露并进行定位

1. 定义:应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费2. 对于C和C++这种没有Garbage Collection 的语言来讲,我们主要关注两种类型的内存泄...
  • patkritLee
  • patkritLee
  • 2016年06月27日 22:50
  • 963

Android 内存泄露总结

Java 中的内存分配简介 Java 中的内存分配 主要是分三块: 静态储存区:编译时就分配好,在程序整个运行期间都存在。它主要存放静态数据和常量。栈区:当方法执行时,会在栈区内...
  • osle123
  • osle123
  • 2016年10月08日 12:17
  • 858

C++内存泄露的定位与解决

PCIe应用程序调试时,发现程序出现内存泄露,经过自己的摸索,以及向软件同学请教,最终解决了此问题。 1. 现象描述 应用程序开发环境为VC++,运用其debug功能进行单步调试时,程序总...
  • asr9k
  • asr9k
  • 2016年11月21日 12:44
  • 427

C++内存泄露和内存管理

一直没有找到系统的讲解C++内存管理的文章,所以结合自己的工作经验,以及网友的一些总结,分析了内存泄露检测的方法,一般原则,最后还补充了内存溢出...
  • swjtuwyp
  • swjtuwyp
  • 2016年05月24日 22:26
  • 825

java中内存泄露有几种?如何分析泄露原因

一、Java内存回收机制 不论哪种语言的内存分配方式,都需要返回所分配内存的真实地址,也就是返回一个指针到内存块的首地址。Java中对象是采用new或者反射的方法创建的,这些对象的创建都是在堆(He...
  • zhousenshan
  • zhousenshan
  • 2016年10月19日 22:34
  • 2099

内存泄露原因及解决方案

一、 Android的内存机制 Android的程序由Java语言编写,所以Android的内存管理与Java的内存管理相似。程序员通过new为对象分配内存,所有对象在java堆内分配空间;然而对象...
  • ForgetFormerly
  • ForgetFormerly
  • 2016年03月24日 10:02
  • 369

C++内存泄露和检测

C++中的内存泄露的原因和内存泄露的检测方法。
  • KangRoger
  • KangRoger
  • 2014年09月16日 16:37
  • 15400
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:-内存泄露初探-
举报原因:
原因补充:

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