精华内容
下载资源
问答
  • 检查内存泄露 检查内存泄露 检查内存泄露
  • 本文为大家分享了Android内存泄漏排查利器,供大家参考,具体内容如下在 build.gralde 里加上依赖, 然后sync 一下, 添加内容如下dependencies {....debugCompile '...

    本文为大家分享了Android内存泄漏排查利器,供大家参考,具体内容如下

    在 build.gralde 里加上依赖, 然后sync 一下, 添加内容如下

    dependencies {

    ....

    debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5'

    releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'

    testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'

    }

    省略号代表其他已有内容

    在 Application类里面将 LeakCanary 初始化。。 比如叫MyApplication ,如果没有就创建一个,继承 android.app.Application。 别忘了在AndroidManifest.xml中加上,否则不起作用

    public class MyApplication extends Application {

    @Override

    public void onCreate() {

    super.onCreate();

    if (LeakCanary.isInAnalyzerProcess(this)) {

    // This process is dedicated to LeakCanary for heap analysis.

    // You should not init your app in this process.

    return;

    }

    LeakCanary.install(this);

    // 你的其他代码从下面开始

    }

    }

    官方已经有demo了,可以跑跑看。

    package com.github.pandafang.leakcanarytest;

    import android.app.Activity;

    import android.os.AsyncTask;

    import android.os.Bundle;

    import android.os.SystemClock;

    import android.view.View;

    public class MainActivity extends Activity {

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    View button = findViewById(R.id.async_task);

    button.setOnClickListener(new View.OnClickListener() {

    @Override public void onClick(View v) {

    startAsyncTask();

    }

    });

    }

    void startAsyncTask() {

    // This async task is an anonymous class and therefore has a hidden reference to the outer

    // class MainActivity. If the activity gets destroyed before the task finishes (e.g. rotation),

    // the activity instance will leak.

    new AsyncTask() {

    @Override protected Void doInBackground(Void... params) {

    // Do some slow work in background

    SystemClock.sleep(20000);

    return null;

    }

    }.execute();

    }

    }

    进入主界面按下按钮, 再按返回键退出主界面, 反复几次,LeakCanary  就能探测到内存泄漏了。注意要多操作几次,1次的话泄漏规模太小,可能不会探测到。LeakCanary  一旦探测到会弹出提示的。

    回到桌面,会看到一个LeakCanary 的图标,如果有多个app 用到就会有多个LeakCanary图标。

    3f2f7a7e1d10e58a60db8b120dff22b3.png

    点进去就会看到内存泄漏记录

    76b0983ffe571d9445c2f787a832a872.png

    再点进去就可以看到调用栈了

    6d642c76c2beb1dc821f9bd62eff5e0d.png

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    展开全文
  • 使用valgrind排查内存泄漏,重点关注leak summary的definite lost数据
    1. 使用valgrind启动程序

      valgrind /path/to/your_program <your_program_args>

      valgrind 默认启动memcheck工具,也就是我们用来排查内存泄漏的工具

    2. 如果你的程序是一个后端服务,给你的服务发请求。适当多发一些请求,这样如果有内存泄漏的话,会更明显。

    3. 结束你的程序,可以ctrl + c,或者kill -2,总之让你的程序退出

    4. 观察valgrind的输出,重点关注LEAK SUMMARY信息,例如:

      ==9599== LEAK SUMMARY:
      ==9599== definitely lost: 5,000 bytes in 100 blocks
      ==9599== indirectly lost: 0 bytes in 0 blocks
      ==9599== possibly lost: 0 bytes in 0 blocks
      ==9599== still reachable: 0 bytes in 0 blocks
      ==9599== suppressed: 0 bytes in 0 blocks

      对于LEAK SUMMARY,我们需要特别关注的是definitely lost数据,这意味着明确的内存泄漏,可以给valgrind增加--leak-check=full开关查看泄漏详情。

      关于definite lostindirectly lostpossibly loststill reachable的识别,valgrind是通过检测是否还有指针指向内存block来判断的。

      四种类型的详细描述及更多的valgrind memcheck参数可参见:http://valgrind.org/docs/manual/mc-manual.html

    展开全文
  • JVM : VisualVM 排查内存泄漏的问题.pdf
  • 使用Purify检查内存泄漏 使用Purify检查内存泄漏 使用Purify检查内存泄漏 使用Purify检查内存泄漏
  • 检查内存泄露

    2017-04-10 09:07:09
    每帧的运行时间随着运行时间在不断增长,很大可能是出现了内存泄露,于是学习了一些查看内存泄露的方法。做了两种尝试 一是VS自带的DEBUG下的检测 view pl [html] view plain copy #...

    自己编写的视频处理程序出现了一个问题

    每帧的运行时间随着运行时间在不断增长,很大可能是出现了内存泄露,于是学习了一些查看内存泄露的方法。做了两种尝试

    一是VS自带的DEBUG下的检测 view pl

    [html]  view plain  copy
    1. #define CRTDBG_MAP_ALLOC    
    2. #include <stdlib.h>    
    3. #include <crtdbg.h>    
    4. //检测内存泄露要包含如上头文件  
    5.   
    6. //定义函数:  
    7. inline void EnableMemLeakCheck()  
    8. {  
    9.     _CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF);  
    10. }  
    11. //该函数可以放在主函数的任意位置,都能正确的触发内存泄露输出  
    12.   
    13.   
    14. //以如下测试函数为例:  
    15. int main()  
    16. {  
    17.     EnableMemLeakCheck();  

    18.     char* pChars = new char[10];  
    19.     return 0;  
    20. }  

    输出:

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

    如果要直接定位指定内存块错误的代码行

    单确定了内存泄漏发生在哪一行,有时候并不足够。特别是同一个new对应有多处释放的情形。在实际的工程中,以下两种情况很典型:

    创建对象的地方是一个类工厂(ClassFactory)模式。很多甚至全部类实例由同一个new创建。对于此,定位到了new出对象的所在行基本没有多大帮助。
     
    COM对象。我们知道COM对象采用Reference Count维护生命周期。也就是说,对象new的地方只有一个,但是Release的地方很多,你要一个个排除。
    那么,有什么好办法,可以迅速定位内存泄漏?

    答:有。

    在内存泄漏情况复杂的时候,你可以用以下方法定位内存泄漏。这是我个人认为通用的内存泄漏追踪方法中最有效的手段。

    我们再回头看看crtdbg生成的内存泄漏报告:

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

    除了产生该内存泄漏的内存分配语句所在的文件名、行号为,我们注意到有一个比较陌生的信息:{58}。这个整数值代表了什么意思呢?

    其实,它代表了第几次内存分配操作。象这个例子,{58}代表了第58次内存分配操作发生了泄漏。你可能要说,我只new过一次,怎么会是第58次?这很容易理解,其他的内存申请操作在C的初始化过程调用的呗。:)

    有没有可能,我们让程序运行到第58次内存分配操作的时候,自动停下来,进入调试状态?所幸,crtdbg确实提供了这样的函数:即 long _CrtSetBreakAlloc(long nAllocID)。我们加上它:

    [html]  view plain  copy
    1. #define CRTDBG_MAP_ALLOC    
    2. #include <stdlib.h>    
    3. #include <crtdbg.h>    
    4.   
    5. int main()  
    6. {  
    7.     _CrtSetBreakAlloc(58);  
    8.     char* pChars = new char[10];  
    9.     _CrtDumpMemoryLeaks();  
    10.     return 0;  
    11. }  

    你发现,程序运行到 char* pChars = new char[10];一句时,自动停下来进入调试状态。细细体会一下,你可以发现,这种方式你获得的信息远比在程序退出时获得文件名及行号有价值得多。因为报告泄漏文件名及行号,你获得的只是静态的信息,然而_CrtSetBreakAlloc则是把整个现场恢复,你可以通过对函数调用栈分析(我发现很多人不习惯看函数调用栈,如果你属于这种情况,我强烈推荐你去补上这一课,因为它太重要了)以及其他在线调试技巧,来分析产生内存泄漏的原因。通常情况下,这种分析方法可以在5分钟内找到肇事者。



    二是Visual Leak Detector

    Visual LeakDetector(VLD)是一款用于Visual C++的免费的内存泄露检测工具。它的特点有:(1)、它是免费开源的,采用LGPL协议;(2)、它可以得到内存泄露点的调用堆栈,可以获取到所在文件及行号;(3)、它可以得到泄露内存的完整数据;(4)、它可以设置内存泄露报告的级别。

             默认情况下,只有在Debug模式下才会启用VLD的功能。

             在使用的时候只要将VLD的头文件和lib文件放在工程文件中即可。

             在需要检测内存泄露的源文件中添加#include “vld.h”

             VLD只能在Windows下使用,它应用在C/C++语言中。

             通过修改vld.ini文件(ReportFile选项),可以设置内存泄露报告的保存位置。

             VLD好像对中文路径不支持。

             VLD的各个版本对应适用于不同的VC/VS编译器,注意选择合适的版本。

    【待补充】


    三是BoundCheck

    【待补充】


    展开全文
  • 对于malloc出的内存的检测方法这篇文章中详细地记录了从检查到找到确定位置到修复的方法,这里不再赘述。但是这是针对于C语言中的malloc方法的,C++中不再推荐使用malloc,取而代之的是new,如果按照这种方法的话,...

    项目工程中存在内存泄露,被折磨了一晚上,终于查了出来,因为之前没有相关的经验,还比较生疏,在此记录下来,方便以后查找。

    对于malloc出的内存的检测方法

    这篇文章中详细地记录了从检查到找到确定位置到修复的方法,这里不再赘述。但是这是针对于C语言中的malloc方法的,C++中不再推荐使用malloc,取而代之的是new,如果按照这种方法的话,可以检测出内存泄露,但是不能确定到具体的位置。

    对于new方法分配的内存的检查

    这里分享一些C++中检测内存泄漏的技巧,与上面的方法不同的是,我们要多定义一个宏命令:#define _CRTDBG_MAP_ALLOC_NEW,部分代码如下:

    #define _CRTDBG_MAP_ALLOC

    #define _CRTDBG_MAP_ALLOC_NEW

    #include

    这几个是必须的头文件和宏定义,之后在工程出口添加:

    _CrtDumpMemoryLeaks();

    运行后”输出”窗口会显示内存泄露信息:

    aa5994495096a2d2af44b8ddaf77c765.bmp

    但是这里的文件位置还不是准确的,指向的是crtdbg.h这个头文件,这里可以用到一个小技巧:双击文件跳转到对应行,添加断点,添加条件,当new的空间大小等于”输出”窗口所显示的空间大小时,触发断点。如图所示:

    bf7496a30c71828669fb44ac195d24a7.bmp

    触发断点后,在“调用堆栈”里就可以看到具体是哪里申请的内存了:

    c75a53548115d5ecb10d26e41450c8de.bmp

    当然,这只是一种“歪门邪道”,因为如果泄露的内存大小是个很常见的数字,比如8bit,4bit之类,这种方法就没用了。

    展开全文
  • valgrind 检查内存泄漏.pdf
  • 用LeakCanary检查内存泄露Demo
  • LeakCanary检查内存泄露.pdf
  • Jprofile检查内存泄露

    2009-11-26 23:45:37
    Jprofile检查内存泄露问题以及资料
  • valgrind排查内存泄露

    2020-07-17 10:24:19
    在申请堆上内存使用完之后中如果做不到适时有效的释放,那么就会造成内存泄露,久而久之程序就会将系统内存耗尽,导致系统运行出问题。就如同你每天跑去图书馆借一打书籍而不还,直到图书馆倒闭为止。 C语言中申请...
  • 如何检查内存泄漏

    2013-08-01 17:02:24
    如何检查内存泄漏: BoundsChecker 是一个Run-Time错误检测工具,它主要定位程序在运行时期发生的各种错误。
  • 排查过程 程序测试运行过程中,...针对这种情形,首先想到的是进行重现,然后使用工具检测排查,同时检测内存,统计出内存泄漏的状况,发现内存泄漏呈线性增长,大概5kb/s。有了这个数据后就可以大概想一下,哪里...
  • linux排查内存泄漏

    2019-07-03 15:32:17
    Memcheck是valgrind应用最广泛的工具,一个重量级的内存检查器,能够发现开发中绝大多数内存错误使用情况,比如:使用未初始化的内存,使用已经释放了的内存内存访问越界等。 使用示例: #include <stdio.h&...
  • vld-10检查内存泄漏工具
  • \log_r1.txt 五:分析 log_r1.txt文件 1)9934 : 两次内存快照之间的内存泄露值 2)121d8 : 第二次快照时内存块大小 3)88a4 : 第一次快照时内存块大小 4)25 : 两次快照间内存被分配的次数 5)46: 第二次快照...
  • 一个用于堆检查工具,用于检测程序在是够有内存泄露,这个功能和valgrind类似。 一个用于Heap profile的工具,用于监控程序在执行过程的内存使用情况。 如何安装 代码:...
  • 如何排查内存泄漏

    2019-08-08 03:15:24
    工具: Chrome[kroʊm]任务管理...表示原生内存,DOM节点存储在原生内存中,如果此值正在增大,则说明正在创建DOM节点; JS使用的内存。表示JS堆,此列包含两个值,需要关注的是实时值(括号中的数值)。实时数值...
  • 用BoundsChecker检查内存泄漏
  • 排查内存泄漏最简单和直观的方法

    千次阅读 2017-10-25 14:46:12
    内存泄漏无疑会严重影响用户体验,一些本应该废弃的资源和对象无法被释放,导致手机内存的浪费,app使用的卡顿,那么如何排查内存泄漏呢?当然,首先我门有google的官方文档可以参考: 排查内存泄漏官方文档 官方...
  • 主要介绍了VisualStudio 使用Visual Leak Detector检查内存泄漏的相关资料,需要的朋友可以参考下
  • Linux 系统中valgrind检查内存泄露说明和安装包,只是简单的说明,使用方法说明中只是说明了一种检测内存泄漏问题的方法和语句
  • 然后运行一下 valgrind + 可执行命令 就可以 检查内存泄漏啦 内存泄漏检测 主要看definitely lost:这里如果是0,说明没有会导致程序崩溃读的内存泄漏问题。 “definitely lost”:确认丢失。程序中存在内存泄露,应...
  • monkey检查内存泄漏

    千次阅读 2017-08-31 09:48:05
     Monkey是一个快速检查内存泄露的好工具,可以初步发现较明显的内存泄露问题。  什么是内存泄露?是指不在使用的对象持续占有内存,造成内存空间的浪费。  检查内存泄露的基本操作步骤:  1.运行Monkey或者固定...
  • 简单说明了一下没有工具的情况如何运用VC库中的工具来检查代码的内存泄漏问题。 一: 内存泄漏 内存泄漏是编程中常常见到的一个问题,内存泄漏往往会一种奇怪的方式来表现出来,基本上每个程序都表现出不同的方式...
  • LeakCanary检查内存泄露

    千次阅读 2016-12-31 05:40:18
    LeakCanary检测内存泄露内存泄露 内存泄露的概念 当一个对象已经不再需要却无法被GC回收,就是内存泄露 内存泄露的危害 “A small leak will sink a great ship.” - Benjamin Franklin 千里之堤, 毁于蚁穴。 ...
  • 内存泄漏无疑会严重影响用户体验,一些本应该废弃的资源和对象无法被释放,导致手机内存的浪费,app使用的卡顿,那么如何排查内存泄漏呢? 当然,首先我们有google的官方文档可以参考,大部分博客的方法也来自于此...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 129,178
精华内容 51,671
关键字:

如何排查内存泄漏