精华内容
下载资源
问答
  • 主要介绍了Java语言中的内存泄露代码详解,具有一定借鉴价值,需要的朋友可以参考下。
  • 检查代码内存泄露

    2017-10-20 15:31:51
    检查代码可能存在内存泄露的地方,不同于vld,安装简单,内部有说明文档,按照说明文档操作即可
  • 在VS2008中需要增加几句代码来显示C++程序中的内存泄露代码如下: #define _CRTDBG_MAP_ALLOC #include #ifdef _DEBUG #define new new(_NORMAL_BLOCK,__FILE__,__LINE__) #endif int main() {  /* ...
    在VS2008中需要增加几句代码来显示C++程序中的内存泄露,代码如下:
    

    #define _CRTDBG_MAP_ALLOC
    #include <crtdbg.h>
    #ifdef _DEBUG
    #define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
    #endif

    int main()
    {
        /*         其他代码      */

        _CrtDumpMemoryLeaks();
        return 0 :
    }

    在使用DEBUG时,程序退出后就会自动报告是否有内存泄漏!

    注意,一定要在程序最后加入(在 return 前面)

    展开全文
  • boundcheck代码内存泄露检测工具

    热门讨论 2011-11-29 14:22:29
    boundcheck代码内存泄露检测工具,是 NuMega 公司出口的一款出色的调试解释执行程式的工具, 它非常容易使用,你甚至於不需要懂得组合语言都能轻易驾驭它。这是for Delphi的版本。
  • Android中内存泄露代码优化及检测

    千次阅读 2012-09-07 17:52:27
    内存泄漏指由于疏忽或错误造成程序未能释放已经... 正如下文所说,内存泄漏与许多其他问题有着相似的症状,并且通常情况下只能由那些可以获得程序源代码的程序员才可以分析出来。然而,有不少人习惯于把任何不需要的
      内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。

            正如下文所说,内存泄漏与许多其他问题有着相似的症状,并且通常情况下只能由那些可以获得程序源代码的程序员才可以分析出来。然而,有不少人习惯于把任何不需要的内存使用的增加描述为内存泄漏,即使严格意义上来说这是不准确的。

    一、内存泄露

            内存泄漏会因为减少可用内存的数量从而降低计算机的性能。最终,在最糟糕的情况下,过多的可用内存被分配掉导致全部或部分设备停止正常工作,或者应用程序崩溃。

            内存泄漏可能不严重,甚至能够被常规的手段检测出来。在现代操作系统中,一个应用程序使用的常规内存在程序终止时被释放。这表示一个短暂运行的应用程序中的内存泄漏不会导致严重后果。

            在以下情况,内存泄漏导致较严重的后果:

            1)程序运行后置之不理,并且随着时间的流失消耗越来越多的内存(比如服务器上的后台任务,尤其是嵌入式系统中的后台任务,这些任务可能被运行后很多年内都置之不理);
            2)新的内存被频繁地分配,比如当显示电脑游戏或动画视频画面时;
            3)程序能够请求未被释放的内存(比如共享内存),甚至是在程序终止的时候;
            4)泄漏在操作系统内部发生;
            5)泄漏在系统关键驱动中发生;
            6)内存非常有限,比如在嵌入式系统或便携设备中;
            7)当运行于一个终止时内存并不自动释放的操作系统(比如AmigaOS)之上,而且一旦丢失只能通过重启来恢复。

    二、内存泄漏检测工具

            当一个Java对象已经没有其他对象引用它时,Java的垃圾回收器会将其回收并释放内存。

            一个Java的Heap Dump文件指的是在一个时间点上Java对象的内存镜像导出文件。它包括了所有的对象、字段、原始类型和对象引用。它可以指示当JVM产生OutOfMemory错误的情况下自动创建一个堆转储。

            使用Eclipse MAT(Eclipse Memory Analyser),有助于图形化基于Java堆转储的对象引用,并提供工具以发现潜在的内存泄露。为了能让Java虚拟机(JVM)在发生OutOfMemory错误时生成内存镜像文件,我们可以使用-XX:+HeapDumpOnOutOfMemoryError选项,如图21.1所示。

            安装Eclipse MAT的步骤如下:

            1)启动Eclipse,点击Help -> Intall New Software...;
            2)点击输入栏右侧小箭头,选择"Juno"(不同版本要找到和自己版本名称对应的选项);
            3)等待列表更新完毕,找到并展开"General Purpose Tools";
            4)选中并下载其中的"Memory Analyser (Incubation)"和"Memory Analyser (Charts)"两项。
            5)之后根据提示进行安装。

    三、MAT使用示例

            1)创建工程

            新建Android 工程 "com.devdiv.test.mat_test"。并且新建如下类,然后运行该工程。

    [代码]java代码:

    package com.devdiv.test.mat_test;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import android.app.Activity;
    import android.os.Bundle;
    
    public class MainActivity extends Activity {
    
        List<String> list = new ArrayList<String>();
    //    private PersonInfo person = new PersonInfo();
        
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            new Thread () {
                @Override
                public void run() {   
                    while (true){
                    	MainActivity.this.list.add("OutOfMemoryError soon");
                    }
                }
            }.start();
        }
      
    }

     2)分析内存

            要获得.hprof内存镜像文件,你可以在进程运行过程中,切换到DDMS的透视图页面,选中您要查看内存镜像的进程,点击“Dump HPROF file”即可。

     
    图16-1  内存镜像文件分析

            生成的hprof文件会默认使用MAT打开,选择“Leak Suspects Report”后,点击Finish按钮。

     
    图16-2  用MAT打开内存镜像文件

            经过一段时间的初始化后,就能够直观地看到关于内存泄露的饼图,如下图所示:

     
    图16-3  内存泄露饼图

            然后就可以查看相关的内存泄露,如下图所示:

     
    图16-4  内存泄露树形图


    展开全文
  • 内存泄露检测

    2012-04-03 11:42:32
    内存泄露检测检测野指针所导致的内存泄露的原代码,提供c++开发的精粹
  • 内存泄露检测工具

    2017-12-02 16:21:53
    内存泄露检测工具,帮助程序员自动化检测内存泄露,定位内存泄露位置,快速方便的排除内存泄露问题。
  • 内存泄露:常见的new创建的对象没有delete释放掉,导致内存的泄露,以后这部分空间将无法再被使用,就会产生Heap Leak。 两种方法检查代码中存在的内存泄漏:使用自带的库和使用工具。 一 使用自带的库crtdbg.h ...

    内存泄露:常见的new创建的对象没有delete释放掉,导致内存的泄露,以后这部分空间将无法再被使用,就会产生Heap Leak。

    两种方法检查代码中存在的内存泄漏:使用自带的库和使用工具。

    一 使用自带的库crtdbg.h

    不用安装工具,但需要不断的手动修改中断位置。

    
    #include <crtdbg.h>
    int main()
    {
        //_CrtSetBreakAlloc(77); //在申请指定内存的位置中断
        int *p = new int[10];
        _CrtDumpMemoryLeaks();//检查内存泄漏
        return 0;
    }

    在main函数最后加_CrtDumpMemoryLeaks(); 然后debug调试程序,会输出泄露的内存位置。

    Detected memory leaks!
    Dumping objects ->
    {77} normal block at 0x008F5500, 40 bytes long.
     Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD 
    Object dump complete.

    {77}是内存泄露定位值,有40字节泄露。

    在main函数开始加_CrtSetBreakAlloc(77); 然后调试,会在申请指定内存(77)的位置中断。

    二、安装工具

    下载安装vld-2.5-setup.exe 百度搜索或云盘下载https://pan.baidu.com/s/1FHK7jk87EIzFF-0ipaeCSA

    直接默认安装即可。会提示关闭VS,然后自动配置VS。

    此工具好像不支持2017(会提示内存泄漏,但不定位行号),需要修改。

    用以下VS2017的两个dll替换VLD的。

    %programfiles(x86)%\Microsoft Visual Studio\2017\Community\Common7\IDE\CommonExtensions\Microsoft\TestWindow\Extensions\Cpp\dbghelp.dll 到 %programfiles(x86)%\Visual_Leak_Detector\bin\Win32
    
    %programfiles(x86)%\Microsoft Visual Studio\2017\Community\Common7\IDE\CommonExtensions\Microsoft\TestWindow\Extensions\Cpp\x64\dbghelp.dll 到 %programfiles(x86)%\Visual_Leak_Detector\bin\Win64
    

    #include "vld.h" 然后调试就会定位行号了。

    展开全文
  • C++内存泄露检测

    万次阅读 多人点赞 2014-09-16 16:37:42
    C++中的内存泄露的原因和内存泄露检测方法。

    C++中的内存泄露一般指堆中的内存泄露。堆内存是我们手动malloc/realloc/new申请的,程序不会自动回收,需要调用free或delete手动释放,否则就会造成内存泄露。内存泄露其实还应该包括系统资料的泄露,比如socket连接等,使用完后也要释放。

    内存泄露的原因:

    总结下来,内存泄露大概有一下几个原因:

    1、编码错误:malloc、realloc、new申请的内存在堆上,需要手动显示释放,调用free或delete。申请和释放必须成对出现malloc/realloc对应free,new对应delete。前者不会运行构造/析构函数,后者会。对于C++内置数据类型可能没差别,但是对于自己构造的类,可能在析构函数中释放系统资源或释放内存,所以要对应使用。

    2、“无主”内存:申请内存后,指针指向内存的起始地址,若丢失或修改这个指针,那么申请的内存将丢失且没有释放。

    3、异常分支导致资源未释放:程序正常执行没有问题,但是如果遇到异常,正常执行的顺序或分支会被打断,得不到执行。所以在异常处理的代码中,要确保系统资源的释放。

    4、隐式内存泄露:程序运行中不断申请内存,但是直到程序结束才释放。有些服务器会申请大量内存作为缓存,或申请大量Socket资源作为连接池,这些资源一直占用直到程序退出。服务器运行起来一般持续几个月,不及时释放可能会导致内存耗尽。

    5、类的析构函数为非虚函数:析构函数为虚函数,利用多态来调用指针指向对象的析构函数,而不是基类的析构函数。


    内存泄露的检测

    内存泄露的关键就是记录分配的内存和释放内存的操作,看看能不能匹配。跟踪每一块内存的声明周期,例如:每当申请一块内存后,把指向它的指针加入到List中,当释放时,再把对应的指针从List中删除,到程序最后检查List就可以知道有没有内存泄露了。Window平台下的Visual Studio调试器和C运行时(CRT)就是用这个原理来检测内存泄露。

    在VS中使用时,需加上

    #define _CRTDBG_MAP_ALLOC

    #include <crtdbg.h>

    crtdbg.h的作用是将malloc和free函数映射到它们的调试版本_malloc_dbg和_free_dbg,这两个函数将跟踪内存分配和释放(在Debug版本中有效)

    _CrtDumpMemoryLeaks();

    函数将显示当前内存泄露,也就是说程序运行到此行代码时的内存泄露,所有未销毁的对象都会报出内存泄露,因此要让这个函数尽量放到最后。

    例如:

    #define _CRTDBG_MAP_ALLOC
    #include <crtdbg.h>
    #include <iostream>
    using namespace std;
    int main(int argc,char** argv)
    {
    	char *str1 = NULL;
    	char *str2 = NULL;
    	str1=new char[100];
    	str2=new char[50];
    
    	delete str1;
    	_CrtDumpMemoryLeaks();
    	return 0;
    }

    上述代码中,内存申请了两块,但是只释放了一块,运行调试,会在output窗口输出:

    Dumping objects ->
    {136} normal block at 0x00084D70, 50 bytes long.
     Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD 
    Object dump complete.

    可以看到会检测到内存泄露。 但是并没有检测到泄露内存申请的位置,已经加了宏定义#define _CRTDBG_MAP_ALLOC。原因是申请内存用的是new,而刚刚包含头文件和加宏定义是重载了malloc函数,并没有重载new操作符,所以要自己定义重载new操作符才能检测到泄露内存的申请位置。修改如下:

    #define _CRTDBG_MAP_ALLOC
    #include <crtdbg.h>
    #ifdef _DEBUG //重载new
    #define new  new(_NORMAL_BLOCK, __FILE__, __LINE__)  
    #endif
    #include <iostream>
    using namespace std;
    int main(int argc,char** argv)
    {
    	char *str1 = NULL;
    	char *str2 = NULL;
    	str1=(char*)malloc(100);
    	str2=new char[50];
    
    	_CrtDumpMemoryLeaks();
    	return 0;
    }

    运行结果:

    Detected memory leaks!
    Dumping objects ->
    e:\c++\test\内存泄露检测2\main.cpp(13) : {62} normal block at 0x001714F8, 50 bytes long.
     Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
    e:\c++\test\内存泄露检测2\main.cpp(12) : {61} normal block at 0x00171458, 100 bytes long.
     Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
    Object dump complete.

    可以看到

    main.cpp()括号里面的数字就是泄露内存的起始位置。那么后面的{62} normal block at 0x001714F8, 50 bytes long.
    代表什么?

    大括号{}里面的数字表示第几次申请内存操作;0x001714F8表示泄露内存的起始地址,CD CD表示泄露内存的内容。

    为什么是第62次申请内存,因为在初始化操作时也申请了内存。通过这个信息,可以设置断点。调用long _CrtSetBreakAlloc(long nAllocID)可以再第nAllocID次申请内存是中断,在中断时获取的信息比在程序终止时获取的信息要多,你可以调试,查看变量状态,对函数调用调试分析,解决内存泄露。

    block分为3中类型,此处为normal,表示普通,此外还有client表示客户端(专门用于MFC),CRT表示运行时(有CRT库来管理,一般不会泄露),free表示已经释放掉的块,igore表示要忽略的块。

    在上面程序中,调用_CrtDumpMemoryLeaks()来检测内存泄露,如果程序可能在多个地方终止,必须在多个地方调用这个函数,这样比较麻烦,可以在程序起始位置调用_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ),这样无论程序何时终止,都会在终止前调用_CrtDumpMemoryLeaks()。

     

    除此之外,还可以在某时刻设置检查点,获取当时内存状态的快照。比较不同时刻内存状态的差异。

    #define _CRTDBG_MAP_ALLOC
    #include <crtdbg.h>
    #ifdef _DEBUG //重载new
    #define new  new(_NORMAL_BLOCK, __FILE__, __LINE__)  
    #endif
    #include <iostream>
    using namespace std;
    int main(int argc,char** argv)
    {
    	_CrtMemState s1, s2, s3;
    	char *str1 = NULL;
    	char *str2 = NULL;
    	str1=(char*)malloc(100);
    	_CrtMemCheckpoint( &s1 );//记录内存快照
    	_CrtMemDumpStatistics( &s1 );//输出
    	str2=new char[50];
    	_CrtMemCheckpoint( &s2 );
    	_CrtMemDumpStatistics( &s2 );
    
    	if ( _CrtMemDifference( &s3, &s1, &s2) )//比较s1和s2,把比较结果输出到s3
    		_CrtMemDumpStatistics( &s3 );// dump 差异结果
    
    	return 0;
    }


    输出结果为:

    0 bytes in 0 Free Blocks.
    100 bytes in 1 Normal Blocks.
    8434 bytes in 54 CRT Blocks.
    0 bytes in 0 Ignore Blocks.
    0 bytes in 0 Client Blocks.
    Largest number used: 8963 bytes.
    Total allocations: 14003 bytes.
    0 bytes in 0 Free Blocks.
    150 bytes in 2 Normal Blocks.
    8434 bytes in 54 CRT Blocks.
    0 bytes in 0 Ignore Blocks.
    0 bytes in 0 Client Blocks.
    Largest number used: 8963 bytes.
    Total allocations: 14053 bytes.
    0 bytes in 0 Free Blocks.
    50 bytes in 1 Normal Blocks.
    0 bytes in 0 CRT Blocks.
    0 bytes in 0 Ignore Blocks.
    0 bytes in 0 Client Blocks.
    Largest number used: 0 bytes.
    Total allocations: 50 bytes.


    也可以用此法更复杂检测内存泄露,例如设置检查点,检查检查点之间的内存泄露。

    在Linux下也有类似的方法,具体可以参考:http://en.wikipedia.org/wiki/Mtrace

    展开全文
  • 内存泄露检查工具

    2018-05-02 11:33:47
    用于检查编写的代码内存泄露点,是编程人员提高代码质量、减少bug的利器
  • Android内存泄露自动检测LeakCanary

    千次阅读 2016-05-20 15:13:30
    工具呢,当然也有很多,比如DDMS、MAT等,但是怎样在我们编码过程中植入内存检测代码,让我们程序在开发调试阶段就能发现内存泄露呢?好了,现在该大名鼎鼎的LeakCanary出场了,它是Square公司的一个内存探测
  • /*----------------------------------------------------------------VC中检测内存泄露代码:在申请了动态内存空间后常常会忘记在不用的时候释放,这样会造成内存的浪费等其他问题。怎样检查你的代码有没有内存...
  • 点击蓝字关注我,和zz_jesse一起精进本文目标了解和可以使用一种工具分析自己的代码是否存在内存泄露内存泄露怎样产生的造成内存泄露的根本原因就是我们写的代码中存在某些对...
  • 之前有一篇文章提到内存泄露,如果你还不知道安卓中内存泄露是怎么回事,可以去看: Android之内存泄露与内存管理 ...那么知道了内存泄露,那么...下面,我们使用LeakCanary来检测并且找出内存泄露的bug。下面,我们
  • iphone开发过程中,代码中的内存泄露我们很容易用内存检测工具leaks 检测出来,并一一改之,但有些是因为ios 的缺陷和用法上的错误,leaks 检测工具并不能检测出来,你只会看到大量的内存被使用,最后收到...
  • 内存泄露检测

    千次阅读 2013-04-04 12:12:32
    内存泄露是指程序在运行过程中动态申请的内存空间不再使用后没有及时释放,从而很可能导致应用程序内存无线增长。更广义的内存泄露包括未对系统的资源的及时释放,比如句柄等。 内存溢出即用户在对其数据缓冲区...
  • android native 代码内存泄露 定位方案

    千次阅读 2017-06-21 21:45:52
    android native 代码内存泄露 定位方案 java代码的内存定位,暂时我们先不关注。此篇文章,主要围绕c c++代码内存泄露。 ** *欢迎留言,交流您所使用的内存泄露定位方案。*c c++代码,由于其特殊性质,没有...
  • 通常,来讲为了避免内存泄露的情况出现,一般要求,我们尽量的malloc之后,调用free。但是总会有忘记free的时候啊。  可以有如下几种方式来避免内存泄露: 1) 使用智能指针,这个在C++中较为常见; 2) 使用内存...
  • Android内存泄露自动检测神器LeakCanary

    千次阅读 2017-12-18 10:02:57
     工具呢,当然也有很多,比如DDMS、MAT等,但是怎样在我们编码过程中植入内存检测代码,让我们程序在开发调试阶段就能发现内存泄露呢?好了,现在该大名鼎鼎的LeakCanary出场了,它是Square公司的一个内存探测开源...
  • MFC内存泄露检测

    2021-03-04 18:01:40
    1.常规内存泄露检测 常规内存泄露一般是由于编程者在手动申请内存空间之后没有释放造成的。如用new、malloc()函数或CString的GetBuuffer()函数申请内存空间后没有使用对应的释放语句释放内存空间.
  • windows内存泄露检测

    2021-02-04 15:10:46
    windows内存泄露检测一、VLD简介二、测试代码三、重要说明 一、VLD简介 VLD(Visual Leak Detector)是一款用于 Visual C++ 的免费内存泄露检测工具。相比较其它内存泄露检测工具,它在检测到内存泄漏的同时,还具有...
  • 自己写的代码内存呼呼的往上涨,同事告诉我一个内存泄露检查的工具valgrind,于是就用了用。 1安装 sudo apt-get install valgrind 也可以到官方网站去下载:http://www.valgrind.org 2使用 结果输出到终端,...
  • 非常好用的内存泄露检测工具,只需不到1M的安装空间,即可在代码中进行检测内存泄露问题。
  • 内存泄露

    2019-09-17 10:12:26
    内存泄露 简单点来讲,就是由于疏忽或者错误造成了程序未能释放掉不再使用内存的情况。 ①堆内存泄露,malloc,realloc ...① Linux 环境下的内存泄露检查工具 ②在写代码时添加内存申请和释放的统计功能,统计...
  • 内存泄露检测

    2011-09-30 19:58:20
    内存泄漏是非常常见的问题,当以前分配的一片内存不再需要使用或无法访问时,但是却并没有释放它,那么对于该进程来说,会因此导致总可用...本资源能有效的辅助检测和调试程序中的内存泄露问题,为国外开源社区代码
  • FastMM 定位内存泄露代码位置

    千次阅读 2011-03-17 17:09:00
    FastMM 定位内存泄露代码位置
  • valgrind检查内存泄露

    千次阅读 2019-06-05 22:33:46
    c++没有垃圾回收机制,程序往往会出现...valgrind是一个检测内存泄露的工具。 安装 sudo apt-get install valgrind 使用 写一个产生内存泄露代码,名为leak1.cpp //leak1.cpp #include <cstdlib> using nam...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 71,544
精华内容 28,617
关键字:

内存泄露代码检测