一.什么是内存泄露
内存泄露(memory leak)指由于编程疏忽或错误造成应用程序未能释放已经不能使用的内存的情况。当以前分配的一片内存不再需要使用或无法访问时,但是却并没有释放它,那么对于该进程来说,会因此导致总可用内存的减少,这时就出现了内存泄漏。内存泄露并不是指内存在物理上的消失。
在C++中,内存分成5个区,他们分别是:堆,栈,自由存储区,全局/静态存储区,常量存储区。其中栈是由编译器自动管理内存,在需要时自动分配,不需要时自动释放的存储区;而堆是由程序员自己分配释放内存的,容易产生内存泄露。
一般我们常说的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显式释放的内存。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
二.内存泄露的影响
应用程序发生内存泄露后,一般最后的结果有三种,一种是程序崩溃,一种是系统内存不足,还有一种是程序不会崩溃,但是系统的反应速度明显降低,需要reboot程序才会正常。
李谷一丈夫去世因内存泄漏而引起的可用内存数量减少会降低计算机的性能。当系统所有的内存全部耗完后(包括物理
内存和虚拟内存,在嵌入式系统中,仅有物理内存),所有申请内存的操作将失败,系统崩溃。
一个短暂运行的应用程序中内存泄露不会导致严重后果。
自己怎么做手帐贴纸在以下情况,内存泄漏导致较严重的后果:
1.程序运行后置之不理,并且随着时间的流失消耗越来越多的内存(比如服务器上的后台
任务,尤其是嵌入式系统中的后台任务,这些任务可能被运行后很多年内都置之不理);
2.新的内存被频繁地分配,比如当显示电脑游戏或动画视频画面时;
3.程序能够请求未被释放的内存(比如共享内存),甚至是在程序终止的时候;
4.泄漏在操作系统内部发生;
5.泄漏在系统关键驱动中发生;
6.内存非常有限,比如在嵌入式系统或便携设备中;
7.当运行于一个终止时内存并不自动释放的操作系统(比如AmigaOS)之上,而且一旦丢
失只能通过重启来恢复。
三.内存泄露的原因
内存泄露产生的原因一般有三种情况(在开发人员写的代码中):
1.分配完内存后没有回收。用完内存后一定要回收,如果不回收就会造成内存泄露。造成
内存泄露的代码如果被经常调用的话,那内存泄露的数目就会越来越多,影响整个系统的运行。
2.代码有问题,导致某些内存想回收都收不回来。
3.某些API函数操作不正确,造成内存泄漏。
API函数应用不当,在Windows提供API函数里面有一些特殊的API,比如FormatMessage。如果你给它参数中有FORMAT_MESSAGE_ALLOCATE_BUFFER,它会在函数内部New一块内存Buffer出来。但是这个buffer需要你调用LocalFree来释放。如果忘了,那就会产生内存泄漏。
四.内存泄露检测
内存消耗持续增加不一定表明内存泄露。内存泄露是一种编程错误,如果没有源代码,根据表现只能
猜测可能有内存泄露。
在源代码中,监测内存泄露的关键是要能截获住对分配内存和释放内存的函数的调用,截获住这两个函数,就能跟踪每一块内存的生命周期。有malloc/realloc就要有free,有new 就要有delete,用完的指针就要赋NULL。
在Windows平台下,检测内存泄漏的工具常用的一般有三种,MS C-Runtime Library内建的检测功能;外挂式的检测工具,如Purify,BoundsChecker等;利用Windows NT自带的Performance Monitor。
五.内存泄露检测工具(针对开发,作为参考)
婚姻保卫战经典语录2.Dmalloc-Debug Malloc Library.
3.Electric Fence-Linux分发版中由Bruce Perens编写的malloc()调试库。
4.Leaky-Linux下检测内存泄漏的程序。
5.LeakTracer-Linux、Solaris和HP-UX下跟踪和分析C++程序中的内存泄漏。
6.MEMWATCH-由Johan Lindh编写,是一个开放源代码C语言内存错误检测工具,主要
是通过gcc的precessor来进行。预订火车票时间
7.Valgrind-Debugging and profiling Linux programs, aiming at programs written in C and C++.
8.KCachegrind-A visualization tool for the profiling data generated by Cachegrind and
Calltree.
9.Leak Monitor-一个Firefox扩展,能出跟Firefox相关的泄漏类型。
10.IE Leak Detector (Drip/IE Sieve)-Drip和IE Sieve leak detectors帮助网页开发员提升动态
网页性能通过报告可避免的因为IE局限的内存泄漏。
11.Windows Leaks Detector-探测任何Win32应用程序中的任何资源泄漏(内存,句柄等),
基于Win API调用钩子。
12.SAP Memory Analyzer-是一款开源的JAVA内存分析软件,可用于辅助查JAVA程序的
内存泄漏,能容易到大块内存并验证谁在一直占用它,它是基于Eclipse RCP(Rich Client Platform),可以下载RCP的独立版本或者Eclipse的插件。英文写信格式
13.DTrace-即动态跟踪Dynamic Tracing,是一款开源软件,能在Unix类似平台运行,用户
能够动态检测操作系统内核和用户进程,以更精确地掌握系统的资源使用状况,提高系统性能,减少支持成本,并进行有效的调节。
14.IBM Rational PurifyPlus-帮助开发人员查明C/C++、托管.NET、Java和VB6代码中的性能
和可靠性错误。PurifyPlus 将内存错误和泄漏检测、应用程序性能描述、代码覆盖分析等功能组合在一个单一、完整的工具包中。
15.Parasoft Insure++-针对C/C++应用的运行时错误自动检测工具,它能够自动监测C/C++
程序,发现其中存在着的内存破坏、内存泄漏、指针错误和I/O等错误。并通过使用一系列独特的技术(SCI技术和变异测试等),彻底的检查和测试我们的代码,精确定位错误的准确位置并给出详细的诊断信息。能作为Microsoft Visual C++的一个插件运行。16.Compuware DevPartner for Visual C++ BoundsChecker Suite-为C++开发者设计的运行错
误检测和调试工具软件。作为Microsoft Visual Studio和C++ 6.0的一个插件运行。
17.Electric Software GlowCode-包括内存泄漏检查,code profiler,函数调用跟踪等功能。
给C++和.Net开发者提供完整的错误诊断,和运行时性能分析工具包。
18.Compuware DevPartner Java Edition-包含Java内存检测,代码覆盖率测试,代码性能测试,
线程死锁,分布式应用等几大功能模块。
19.Quest JProbe-分析Java的内存泄漏。
20.ej-technologies JProfiler-一个全功能的Java剖析工具,专用于分析J2SE和J2EE应用程
序。它把CPU、执行绪和内存的剖析组合在一个强大的应用中。JProfiler可提供许多IDE 整合和应用服务器整合用途。JProfiler直觉式的GUI让你可以到效能瓶颈、抓出内存泄漏、并解决执行绪的问题。4.3.2注册码:A-G666#76114F-1olm9mv1i5uuly#0126
21.BEA JRockit-用来诊断Java内存泄漏并指出根本原因,专门针对Intel平台并得到优化,
能在Intel硬件上获得最高的性能。
22.SciTech Software AB .NET Memory Profiler-到内存泄漏并优化内存使用针对C#,
VB.Net,或其它.Net程序。
23.YourKit .NET & Java Profiler-业界领先的Java和.NET程序性能分析工具。
24.AutomatedQA AQTime-AutomatedQA的获奖产品performance profiling和memory
debugging工具集的下一代替换产品,支持Microsoft, Borland, Intel, Compaq 和GNU编译器。可以为.NET和Windows程序生成全面细致的报告,从而帮助您轻松隔离并排除代码中含有的性能问题和内存/资源泄露问题。支持.Net 1.0,1.1,2.0,3.0和Windows 32/64位应用程序。
25.JavaScript Memory Leak Detector-微软全球产品开发欧洲团队(Global Product
Development- Europe team, GPDE) 发布的一款调试工具,用来探测JavaScript代码中的内存泄漏,运行为IE系列的一个插件。
六.利用任务管理器监测内存泄露(针对测试,windows)
任务管理器与内存泄露紧密相关的只有两项,一是内存使用率,一是当前句柄数。
1.内存泄露的测试方法
打开任务管理器,此时要减少电脑或虚拟机上其它类型的活动程序,尽量保证查看到的参数和当前运行的程序有较大的相关性。记录此时的内存使用率。在没有其它程序的情况下,应该是一个较低较稳定的值。
打开需要监视的程序,检测此时任务管理器的内存使用率的情况(尽量把任务管理器界面的刷新次数调高点,太低如4秒,参考到的值个人认为就不精确了),首先看大约增长了多少(估计此程序运行时占用的内存数,可以作为软件性能的参考)。
调用服务或者其它可能引起内存泄露的操作,检查第一次调用后内存使用率增长的情况。关闭服务或界面,同时查看进程线程数,是否随之变化。查看内存是否恢复到之前的水平。如果这个结果不明显,可以重复操作,相当于把泄露累计起来。如果重试了很多遍,内存仍然和第一次打开程序时的比例持平,基本认为没有内存泄露。
2.句柄泄露的测试方法
打开任务管理器,得到当前的句柄数,运行程序,查看句柄数。然后关闭,查看句柄数。运行多次,得到两组值。如果是间隔的上下,并且数值相差不大,认为无泄露。
这些方法不能完全确认程序是否杜绝了所有的内存泄露或句柄泄露,但是对于一些比较明显的问题,任务管理器查看法不失为一种方便快捷的途径。
七.任务管理器各项性能参数的含义
cpu使用率:可理解为目前运行的程序占用了处理器运算能力的比例。
PF使用率:虚拟内存已经使用的总空间:对于每个32位机下的进程来说,最多都有4GB的缓存空间。
总数
句柄数:其实是当前所有进程的所有活动句柄,所有进程使用的所有对象。
线程数:进程的子单位。
进程数:程序或服务总数。
物理内存
总数:计算机上安装的总物理内存,也称RAM。
搜狗私有化完成可用数:物理内存中可被程序使用的空余量。但实际的空余量要比这个数值略大一点,因为物理内存不会在完全用完后才去转用虚拟内存的。也就是说这个空余量是指使用虚拟内存(pagefile)前所剩余的物理内存。
系统缓存:被分配用于系统缓存用的物理内存量。主要来存放程序和数据等。一但系统或者程序需要,部分内存会被释放出来,也就是说这个值是可变的。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论