如何查找内存泄露

作者&投稿:彩往 (若有异议请与网页底部的电邮联系)
Android中如何查找内存泄露~

1、首先确定是否有内存泄露及哪个程序造成。
1.1、内存泄露已弹出out of memory对话框的情况。
这种情况很简单,直接看对话框就知道是哪个应用的问题了。然后再分析该应用是否是因为内存泄露造成的
out of memory对话框。
》中介绍的各种方法进行分析,确定是否有内存泄露以及是哪个进程造成的内存泄露。
2、生成hprof文件,用MAT进行分析。
生成hprof文件可以在DDMS选中进程点击窗口左上角的dump hprof file按钮来直接生成,也可以通过在程序加代码中来生成代码2:voidgenerateHprof(){String packageName=getApplicationInfo().packageName;
StringhpFilePath=/data/data/+packageName+/input.hprof;try{//Debug.dumpHprofData(/sdcard/input.hprof);Debug.
dumpHprofData
(hpFilePath);}catch(IOException e) {//TODOAuto-generated catch block
e.printStackTrace();}}建议使用代码生成hprof,然后使用《
Android内存泄露利器(hprof篇)》中的工具自动提取多个hprof文件,然后用MAT进行比较分析。在MAT导入.hprof文件以后,
MAT会自动解析并生成报告,点击
Dominator Tree
,并按Package分组,选择自己所定义的Package类,比较各个类在不同时期的RetainedHeap
,找出可疑类,然后选择该类,点右键,选中
show retained Set项,参看Retained Heap
的详细信息,进一步找出嫌疑项。
3、在代码中查找内存泄露。
根据在MAT找到的内存泄露信息,参照《
Android内存泄漏简介
》进一步在内存中查找内存泄露的原因并解决。
另外如果代码很简单,可以直接参照《
Android内存泄漏简介
》在内存中查找内存泄露的原因并解决。

若要确保您的应用程序正在泄漏内存,请将怀疑与多个小版本,一个循环中的代码,然后监视 $
专用和对于任何增加的内存的虚拟字节。监视以确保数专用字节和虚拟字节数不会不最终将保持相同,数字停止增加。如果没有内存会停止点不断增加,(例如,它不会不继续无限期地顺)
执行操作不会看到一个内存泄漏漏洞,但更有可能,您看到的增长缓存其最大大小。

如果您确定可以看出,内存泄漏之前使用 UMDH,请按照下列步骤操作:

安装的 UMDH 实用程序。

设置要包含系统 PATH 环境变量UMDH 的安装位置的文件夹。

将 _NT_SYMBOL_PATH 环境变量设置为Microsoft 符号服务器路径,以便 UMDH 可以找到调试符号文件。
UMDH
实用程序是附带的调试工具Windows 产品在下面的 Microsoft 网站:
http://www.microsoft.com/whdc/devtools/ddk/default.mspx (http://www.microsoft.com/whdc/devtools/ddk/default.mspx)
下载并安装该应用工具,然后将路径的系统设置环境变量,以在安装调试工具的路径。

这两天,在查找内存泄露的问题。因为内存都是放在memory pool里,所以不能通过valgrind等工具抓到那个地方分配的内存没有手动被释放。使用gcc,有一个方法去打包内存分配函数,而且不需要编辑已有的code并且不需要修改目标文件。linker ld 提供了一个内建的选项去替换函数符号。 –wrap(一个横线) 表示把函数 func 替换为(两个下划线前缀)__wrap_func 。可以通过这个选项传给gcc去做恰当的链接。举个例子来说明吧。 如果最后的free函数被注释掉,那么p就会出现内存泄漏,如果calloc已经被打包把内存放到memory pool里,程序退出激活释放memory pool的话。那么在程序为退出之前,那些mem还是存在的,因此当前进程会暂用很多内存(如果很多分配没有free的话) view plaincopy to clipboard#include<iostream> using namespace std; int main() { int allocTimes = 100; while(allocTimes--) { int *p = (int*)calloc(5, sizeof(int)); //free(p); } } 怎样来检查这些分配没释放的内存呢。就可以使用上面说的,定义一些函数,然后通过编译器传给连接器去替换函数。把这些函数定义在一个文件中(test.h):view plaincopy to clipboard#ifndef TEST_INC #define TEST_INC #include<iostream> using namespace std; #ifdef __cplusplus extern "C" { #endif extern void *__real_calloc(size_t nmemb, size_t size); extern void *__real_realloc(void *ptr, size_t size); extern void *__real_malloc(size_t size); extern void __real_free(void *ptr); void *__wrap_calloc(size_t numemb, size_t size); void *__wrap_realloc(void *ptr, size_t size); void *__wrap_malloc(size_t size); void __wrap_free(void *ptr); /* wrap calloc */ void * __wrap_calloc(size_t numemb, size_t size) { cout << "wrap alloc" << endl; return __real_calloc(numemb, size); } /* wrap realloc */ void * __wrap_realloc(void *ptr, size_t size) { cout << "wrap realloc" << endl; return (void*)__real_realloc(ptr, size); } /* wrap malloc */ void * __wrap_malloc(size_t size) { cout << "wrap malloc" << endl; return (void*)__real_malloc(size); } /* wrap malloc */ void __wrap_free(void *p) { cout << "wrap free" << endl; __real_free(p); } #ifdef __cplusplus }; /* end of extern "C" */ #endif #endif /* ----- #ifndef TEST_INC ----- */ .cpp只需要加上这个头文件view plaincopy to clipboard#include<iostream> using namespace std; <span style="color:#ff0000;">#include "test.h"</span> int main() { int allocTimes = 100; while(allocTimes--) { int *p = (int*)calloc(5, sizeof(int)); //free(p); } } 然后在Makefile加上编译选项CFLAGS = -g -O0 -Wall -Wl,--wrap,malloc -Wl,--wrap,free -Wl,--wrap,calloc -Wl,--wrap,realloc 或者g++ test.cc -o test -g -O0 -Wall -Wl,--wrap,calloc -Wl,--wrap,free -Wl,-wrap,malloc -Wl,-wrap,realloc 去编译一个文件执行./test 即可发现alloc 和 free不匹配。此方法只是抛砖引玉。


Redis和Memcache的区别总结
区别:1、存储方式不同 memecache 把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小;redis有部份存在硬盘上,这样能保证数据的持久性,支持数据的持久化(笔者注:有快照和AOF日志两种持久化方式,在实际应用的时候,要特别注意配置文件快照参数,要不就很有可能服务器频繁满载做dump)。2、...

Web前端岗位面试题有哪些
36、DOM操作——怎样添加、移除、移动、复制、创建和查找节点?37、.call() 和 .apply() 的含义和区别?38、数组和对象有哪些原生方法,列举一下?39、JS 怎么实现一个类。怎么实例化这个类40、JavaScript中的作用域与变量声明提升?41、如何编写高性能的Javascript?42、那些操作会造成内存泄漏?43、JQuery的源码看过...

JAVA与.net的区别和各自优势?
而C++程序员可以转向C#,.Net代替他们处理这些操作后,内存泄露和其它bug出现的可能性将大大减少。拥有了被管理的代码,你可以访问.Net所有跨语言的能力。 7.平台独立 虽然.Net是为微软的操作系统创建的,但是微软的确为ECMA标准委员会发布了一部分框架和C#。比如,Mono project实现了Linux的.Net,包括架构和C#编译器。

iOS面试题有哪些
tempNumber);} 这段代码有什么问题.?会不会造成内存泄露(多线程)?在内存紧张的设备上做大循环时自动释放池是写在循环内好还是循环外好?为什么?17.内存管理的几条原则时什么?按照默认法则.那些关键字生成的对象需要手动释放?在和property结合的时候怎样有效的避免内存泄露?答:谁申请谁释放。

软件测试的目的是什么?
软件测试的目的是在规定的条件下对程序进行操作,以发现程序错误,衡量软件质量,并对其是否能满足设计要求进行评估的过程。软件测试已有了行业标准(IEEE\/ANSI ),1983年IEEE提出的软件工程术语中给软件测试下的定义是:“使用人工或自动的手段来运行或测定某个软件系统的过程,其目的在于检验它是否满足规定的...

C程序员怎么学习
十一、动态分配内存 1、动态分配的内存是保存在什么地方的?2、什么情况下使用动态分配内存?3、动态申请内存一定要释放,否则会内存泄露。你是否使用过内存检测工具?十二、函数 1、如何查看函数在内存中的地址?2、如何给一个函数指针赋值?3、你是否会定义可变入参函数 4、你是否可以区分函数的形参与...

Java与.net的优势缺点?
java和.net我都做过开发,说下个人感觉(仅为个人观点)。从框架上说,.net里分.net Webform和.net MVC。我认为这是两个截然不同的东西。.net MVC和java ssh我感觉差不多。好坏仁者见仁智者见智,我觉得.net MVC更方便一些,并且MVC的框架本身也开源了,也有很多不错的插件。.net Webform就不一...

redis和memcached的区别
对于像Redis和Memcached这种基于内存的数据库系统来说,内存管理的效率高低是影响系统性能的关键因素。传统C语言中的malloc\/free函数是最常用的分配和释放内存的方法,但是这种方法存在着很大的缺陷:首先,对于开发人员来说不匹配的malloc和free容易造成内存泄露;其次频繁调用会造成大量内存碎片无法回收重新利用,降低内存利用率...

redis和memcached的区别
对于像Redis和Memcached这种基于内存的数据库系统来说,内存管理的效率高低是影响系统性能的关键因素。传统C语言中的malloc\/free函数是最常用的分配和释放内存的方法,但是这种方法存在着很大的缺陷:首先,对于开发人员来说不匹配的malloc和free容易造成内存泄露;其次频繁调用会造成大量内存碎片无法回收重新利用,降低内存利用率...

Redis 和 Memcached 各有什么优缺点,主要的应用场景是什么样的_百度知...
对于像Redis和Memcached这种基于内存的数据库系统来说,内存管理的效率高低是影响系统性能的关键因素。传统C语言中的malloc\/free函数是最常用的分配和释放内存的方法,但是这种方法存在着很大的缺陷:首先,对于开发人员来说不匹配的malloc和free容易造成内存泄露;其次频繁调用会造成大量内存碎片无法回收重新利用,降低内存利用率...

盐山县15291811621: 如何检测内存泄漏 -
仁炕松根: 内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况.内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费.可以使用相应的软件测试工具...

盐山县15291811621: 如何查找内存泄露 -
仁炕松根: 这两天,在查找内存泄露的问题.因为内存都是放在memory pool里,所以不能通过valgrind等工具抓到那个地方分配的内存没有手动被释放.使用gcc,有一个方法去打包内存分配函数,而且不需要编辑已有的code并且不需要修改目标文件....

盐山县15291811621: 怎样发现内存泄露? -
仁炕松根: 一、内存泄漏的检查方法:1.ccmalloc-Linux和Solaris下对C和C++程序的简单的使用内存泄漏和malloc调试库.2.Dmalloc-Debug Malloc Library.3.Electric Fence-Linux分发版中由Bruce Perens编写的malloc()调试库.4.Leaky-Linux下检测...

盐山县15291811621: 如何检测内存泄漏
仁炕松根: http://www.devdiv.com/forum.php?mod=viewthread&tid=87206&highlight=%C4%DA%B4%E6%D0%B9%C2%A9看看这个有没有帮助还有就是可以通过DDMS查看内存消耗情况

盐山县15291811621: 内存泄露有哪些方法定位,崩溃有哪些方法定位 -
仁炕松根: ios怎么查看内存泄露,有以下几种方法供大家参考: 1. 静态分析 2. 通过静态分析我们可以最初步的了解到代码的一些不规范的地方或者是存在的内存泄漏,这是我们第一步对内存泄漏的检测.当然有一些警告并不是我们关心的可以略过. 3. ...

盐山县15291811621: 系统测试中怎么确定内存泄露 -
仁炕松根: 是不是说没有一种内存检查工具能够在linux使用呢,也不是,像valgrind工具还是相当不错的.他的下载地址是下载一个valgrind3.2.3(tar.bz2)工具,按照里面的README提示,安装后就可以使用这个工具来检测内存泄露和内存越界等.这是一个...

盐山县15291811621: 如何测试一个软件是否内存泄漏,怎么测试?具体点,各位大侠们!!! -
仁炕松根: sIEve内存泄露测试软件--web测试

盐山县15291811621: Android中如何查找内存泄露 -
仁炕松根: 1、首先确定是否有内存泄露及哪个程序造成.1.1、内存泄露已弹出out of memory对话框的情况.这种情况很简单,直接看对话框就知道是哪个应用的问题了.然后再分析该应用是否是因为内存泄露造成的 out of memory对话框.》中介绍的各...

盐山县15291811621: 怎么测试android 内存泄露 -
仁炕松根: 如何查看内存泄露主要有2种方法借助工具,查看.借助adb命令来查看.【主要原理】借助工具来查看泄露的原因.详细实现方式【工具查看】常用工具有很多例如:1.功能强大PC端检测工具,如MemoryAnalyzer运行在PC端抓取...

盐山县15291811621: 如何在linux下检测内存泄漏 -
仁炕松根: 检测内存泄露主要有以下5种方法:1、在需要内存泄漏检查的代码的开始调用void mtrace(void) (该函数在头文件mcheck.h中有声明).mtrace为malloc等函数安装hook,用于记录内存分配信息.在需要内存泄漏检查的代码的结束调用void ...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网