有大神知道怎么排查内存泄露会有什么后果吗

正在初始化报价器gdb内存泄漏怎么检查出来?3个回答泽速浪000980  检查gdb内存泄漏问题: 一般内存泄露 操作系统都是让.exe停止工作,(这个功能使操作系统防止木马病毒的一种机制) 所以一步一步运行 直到停止工作的地方 ,这个停止的地方内存就泄露了。
Maria_4433你好,Valgrind是运行在Linux上一套基于仿真技术的程序调试和分析工具,它包含一个内核──一个软件合成的CPU,和一系列的小工具,每个工具都可以完成一项任务──调试,分析,或测试等。Valgrind可以检测内存泄漏和内存违例,还可以分析cache的使用等,灵活轻巧而又强大,能直穿程序错误的心脏,真可谓是程序员的瑞士军刀。
douweng880如何检查C++中的内存泄漏
内存泄漏是编程中常常见到的一个问题,我所遇过的原因有两个:
1.分配完内存后忘记回收
2.代码有问题,造成想回收却无法回收,例如:
p= //p指针修改,原来申请内存的地址没有记录下来,于是无法释放
下面介绍如何检查内存泄漏:
1.包含头文件和定义
#define _CRTDBG_MAP_ALLOC //并非绝对需要该语句,但如果有该语句,打印出来的是文件名和行数等更加直观的信息
(1)#include语句必须采用上文所示顺序。如果更改了顺序,所使用的函数可能无法正确工作
(2)如果有cpp文件无法看到这三行,以下函数就无效了,于是应该把这三行放到一个头文件里,确保每个cpp文件会调用到它
希望我的回答能帮助到您
热门问答123456789101112131415161718192021222324252627282930相关问答3个回答雷百军内存溢出虽然很棘手,但也有相应的解决办法,可以按照从易到难,一步步的解决。第一步,就是修改JVM启动参数,直接增加内存。这一点看上去似乎很简单,但很容易被忽略。JVM默认可以使用的...4个回答董范董段  要查看进程对应的句柄需要做以下操作(Process Explorer的使用一目了然,就查看句柄费了点劲,blog存档备用):
  打开process explorer
...3个回答泽速浪000980  检查gdb内存泄漏问题: 一般内存泄露 操作系统都是让.exe停止工作,(这个功能使操作系统防止木马病毒的一种机制) 所以一步一步运行 直到停止工作的地方 ,这个停止的地方内存...3个回答沉默小坏TA75内存泄漏测试方法是因在严格意义上的内存泄漏只有一个:应用程序没有释放到系统内存,因为他们不申请内存,它不会泄露任何东西,找出内存泄漏的原因,应该考虑这个问题汇编语言的透视。
...3个回答老头532你好,重载 new 和delete关键字记录new和delete的调用是否一样就可以了。
像vc2003中如果是debug模式运行,如果有内存泄漏就会自动提示你的啦。
...4个回答49O25XXT521.内存泄漏是指分配出去的内存无法回收了内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况,是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了...3个回答家居研究者1、内存溢出是指已有的数据超过了其获得到的内存所能存储的范围,比如用一个字节存放1000这个数字就属于内存溢出;
2、内存泄漏是指程序由于错误或漏洞造成的内存占用过多,或占用...3个回答军佗渔具new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。
4个回答逸风_3158你好,内存溢出就是内存越界。内存越界有一种很常见的情况是调用栈溢出(即stackoverflow),虽然这种情况可以看成是栈内存不足的一种体现。泄漏是说你的程序有BUG 导致内存不...3个回答dpuserAt_你在桌面最下面的空白处,鼠标点右键,弹出一个菜单,你点一下任务管理器,就弹出任务管理器的对话框,你在点一下进程,就出来一排的进程,在对话框的最下面就有CPU的占用率和内存泄漏。希望...求助啊,有大神知道怎么排查内存泄露吗_百度知道
求助啊,有大神知道怎么排查内存泄露吗
我有更好的答案
身边不少海外党都在那,没别的就是速度快,paypal,visa可以到37card啊,master都可以,几秒就可以收到
采纳率:80%
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。轻松搞定JAVA面试之Java 中会存在内存泄漏吗轻松搞定JAVA面试之Java 中会存在内存泄漏吗四十克拉百家号前言--大家好,很快又到周末了,周末对于我们这种IT宅男来说,就是宅着陪电脑,所以今天继续为大家带来一篇JAVA面试文章,希望大家多多转发、收藏、评论、关注本头条号,你们的支持是我持续写作的动力,谢谢。今天我们要探讨的面试题是:Java中会存在内存泄漏吗?我们知道Java内部有一个垃圾回收机制(GC),不像C++(开辟了内存空间还得手动释放),所以理论上java应该不会造成内存泄漏了吧?但是当我们实际做项目开发的时候,就会经常遇到内存泄漏的问题。可能会存在没有用处但是还存在在内存空间的对象,这些对象不能被GC回收,所以这些对象的堆积也会使得内存造成泄漏。比如像hibernate的Session(一级缓存)中的对象属于持久态,垃圾回收器是不会回收这些对象的,然而这些对象中可能存在无用的垃圾对象,如果不及时关闭(close)或清空(flush)一级缓存就可能导致内存泄露。我们来看一个实例:上面的代码主要实现的是栈的结构(FILO先进后出),当我们使用它的时候编译测试都能通过,似乎没有什么问题。然而其中的pop方法却存在内存泄露的问题,因为栈内部维护着对这些对象的过期引用(obsoletereference),当我们用pop方法把栈中的对象弹出时,这个对象不能被当作垃圾回收,即使调用这个栈的程序不再引用这些对象。在JAVA中,内存泄露有着很强的隐蔽性,这种内存泄露其实就是无意识的对象保持。如果这样存在被无意识的保持了的对象,那么这个对象中存在的引用的其他的对象也会被无意识保持,垃圾回收器就不会回收这些对象了。当这样的对象越积越多,就很容易造成内存泄漏。欢迎大神们在评论区进行点评,提出不足和改进之处,我只是起到抛砖引玉的作用!本文仅代表作者观点,不代表百度立场。系作者授权百家号发表,未经许可不得转载。四十克拉百家号最近更新:简介:关注手机数码、智能硬件等消费电子类产品。作者最新文章相关文章内存泄露,请大神帮忙看下,该怎么解决 - C++当前位置:& &&&内存泄露,请大神帮忙看下,该怎么解决内存泄露,请大神帮忙看下,该怎么解决www.MyException.Cn&&网友分享于:&&浏览:0次内存泄露,请大神帮忙看下
class&t_satObs&{
&&t_satObs()&{}
&&t_satObs(const&t_satObs&&old)&{&//&copy&constructor&(deep&copy)
&&&&_staID&=&old._staID;
&&&&_prn&&&=&old._
&&&&_time&&=&old._
&&&&for&(unsigned&ii&=&0;&ii&&&old._obs.size();&ii++)&{
&&&&&&_obs.push_back(new&t_frqObs(*old._obs[ii]));
&&~t_satObs()&{for&(unsigned&ii&=&0;&ii&&&_obs.size();&ii++)&delete&_obs[ii];}
&&std::string&&&&&&&&&&&&_staID;
&&t_prn&&&&&&&&&&&&&&&&&&_
&&bncTime&&&&&&&&&&&&&&&&_
&&std::vector&t_frqObs*&&_
//出现问题的循环,如果加上这段代码,内存总是一直增加,可是没有发现什么问题呀!
while(true)
&&&if&(_rnx)
long&iSec&&&&=&long(floor(obs._time.gpssec()+0.5));
if&(_rnx-&samplingRate()&==&0&||&iSec&%&_rnx-&samplingRate()&==&0)
_rnx-&deepCopy(obs);
_rnx-&dumpEpoch(format,&obs._time);
//调用的函数
void&deepCopy(t_satObs&obs)&{
&&_obs.push_back(obs);&&//_obs为_rnx成员变量,定义:QList&t_satObs&&_
void&dumpEpoch(const&QByteArray&&format,&const&bncTime&&maxTime)&{
&&QList&t_satObs&&obsL
&&QMutableListIterator&t_satObs&&mIt(_obs);
&&while&(mIt.hasNext())&{
&&&&t_satObs&obs&=&mIt.next();
&&&&if&(obs._time&&&maxTime)&{
&&&&&&obsList.push_back(obs);
&&mIt.remove();
大家费心了,如果能指出错误,会补分,跪谢!------解决思路----------------------一般来说,如果有必要写一个深拷贝的拷贝构造函数,那很可能也需要重载赋值运算符------解决思路----------------------需要注意,&delete后内存不一定就会"还给系统"&就是让你看到内存减少.&&这些内存可能会被缓存,&以提高下次new时提高速度.
当然,&你可以这样做,&来排除是否真的有没delete的对象.
定义一个全局变量,&
int&&g_objCount=0;
然后在类t_satObs的构造函数(全部构造函数)&中&&++g_objC
析构函数中&&&--g_objC
最后看这个全局变量如果不为0,则是"可能"有内存泄漏了.------解决思路----------------------用shared_pt,就不用释放了------解决思路----------------------虽然看不怎么懂&&但是我觉得可以定义一个static静态变量并单步执行&&每次调用构造函数static+1并打印信息&&每次调用析构函数则static-1并打印信息&&------解决思路----------------------void&deepCopy(t_satObs&obs)&{
&&_obs.push_back(obs);&&//_obs为_rnx成员变量,定义:QList&t_satObs&&_
将形参改为引用void&deepCopy(t_satObs&&obs)&试试看。&在下面的代码中:
if&(_rnx-&samplingRate()&==&0&------解决思路----------------------&iSec&%&_rnx-&samplingRate()&==&0)
&&&&&&&&&&&&_rnx-&deepCopy(obs);
&_rnx-&deepCopy(obs);&传入obs作为实参,&每次会构造一个临时对象传进去。&在copy&constructor&中
t_satObs(const&t_satObs&&old)&{&//&copy&constructor&(deep&copy)
&&&&_staID&=&old._staID;
&&&&_prn&&&=&old._
&&&&_time&&=&old._
&&&&for&(unsigned&ii&=&0;&ii&&&old._obs.size();&ii++)&{
&&&&&&_obs.push_back(new&t_frqObs(*old._obs[ii]));
_obs.push_back(new&t_frqObs(*old._obs[ii]));&每次构造临时对象会new&t_frqObs(*old._obs[ii]));&这样作为实参的临时对象没有delete。&
引用传参不需要构造临时对象,&可以避免这个
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 1234567891011 Copyright & &&版权所有Android内存泄漏的简单检查与分析方法
内存泄漏问题大约是Android开发者最烦恼的问题之一了,项目中连续遇到几个内存泄漏问题,这里简单总结下检查分析内存泄漏的一些工具与方法。
一、什么是内存泄漏?
大家都知道,java是有垃圾回收机制的,这使得java程序员比C++程序员轻松了许多,存储申请了,不用心心念念要加一句释放,java虚拟机会派出一些回收线程兢兢业业不定时地回收那些不再被需要的内存空间(注意回收的不是对象本身,而是对象占据的内存空间)。
Q1:什么叫不再被需要的内存空间?
答:Java没有指针,全凭引用来和对象进行关联,通过引用来操作对象。如果一个对象没有与任何引用关联,那么这个对象也就不太可能被使用到了,回收器便是把这些“无任何引用的对象”作为目标,回收了它们占据的内存空间。
Q2:如何分辨为对象无引用?
答:2种方法
引用计数法直接计数,简单高效,Python便是采用该方法。但是如果出现 两个对象相互引用,即使它们都无法被外界访问到,计数器不为0它们也始终不会被回收。为了解决该问题,java采用的是b方法。
可达性分析法这个方法设置了一系列的“GC Roots”对象作为索引起点,如果一个对象 与起点对象之间均无可达路径,那么这个不可达的对象就会成为回收对象。这种方法处理 两个对象相互引用的问题,如果两个对象均没有外部引用,会被判断为不可达对象进而被回收(如下图)。
Q3:有了回收机制,放心大胆用不会有内存泄漏?
答:答案当然是No!
虽然垃圾回收器会帮我们干掉大部分无用的内存空间,但是对于还保持着引用,但逻辑上已经不会再用到的对象,垃圾回收器不会回收它们。这些对象积累在内存中,直到程序结束,就是我们所说的“内存泄漏”。
当然了,用户对单次的内存泄漏并没有什么感知,但当泄漏积累到内存都被消耗完,就会导致卡顿,崩溃。
二、发现内存泄漏
内存泄漏不可小视,在Android开发中,比如说一个Activity页面会占用许多资源开销,如果页面发生泄漏,关闭以后页面没有能被系统回收,对应用程序的伤害是很大的。
Q1:在Android开发测试中一般如何发现内存泄漏的发生呢?
答:方法1:反复操作观察内存变化
内存泄漏常见变现为程序使用时间越长,内存占用越多。那我们通过反复操作应用,比如反复点开/关闭页面,观察内存变化状况是否一点点上涨,可以粗略地判断是否有内存泄漏
1.通过 DDMS 中的 heap 工具,可以查看应用内存的使用情况
2.Android studio也可以方便查看
方法2:通过代码检测Activity泄漏
基本思路:
1)debug版本可以起一个长期工作的线程LeakThread在后台专门做泄漏检测
2)向Application注册一个 页面生命周期 的监听:application.registerActivityLifecycleCallbacks
3)在监听类中对 onActivityDestoryed(Activity activity) 的事件回调做处理:
如果一个Activity走到onDestroy,那么这个Activity对象就是需要被回收的目标。
我们声明一个检测对象的弱引用ref = new WeakReference(activity)。
PS:与强引用和软引用相比,弱引用不会被回收器当做一个“有效”的引用,不会影响其引用对象的释放。实际上,垃圾回收器会毫不犹豫地回收只有弱引用的对象~
4)在 LeakThread中我们每隔一段时间检测一下ref.get() 是否为空,为空说明activity已被释放。不为空可以手动触一次发gc;如果超过一段时间,比如50s,页面对象还未被清理,我们可以推断内存泄漏的发生.
5)当内存泄漏发生时,提示给开发者,并自动dump出.prof文件。
因为代码检测不是这里的重点,代码就不贴了,只记思路。
三、分析内存泄漏(DDMS dump + MAT分析)
发现可能出现内存泄漏时,我们需要对.prof文件进行分析,方能快速定位到是哪个倒霉家伙导致了内存泄漏
3.1、如何dump出.prof文件?(可参照前文图片)
打开DDMS ,Eclipse 可以切到DDMS视图,Android studio可以从Tools-Android-Android device monitor进入DDMS
找到app的进程,在进程上方点击“update heap”按钮,可以先主动出发一次GC,待内存占用数据稍微稳定下来后 点击“Dump HProf File”,便可以导出.prof文件
3.2:导出.prof文件后如何分析?
Android studio可以直接打开prof文件。点开Analyzer Tasks的面板,点击右上角的开始按钮。
分析完成后,发生内存泄漏的页面对象会出现在Analysis Results面板-Leak Activityes的目录下。
如图,原来泄漏发生是LoadingRoomActivity的锅!
3.3 进一步分析泄漏的原因,你会需要一个好用的内存分析工具:MAT
在官网可以下载到它:
虽然MAT不会准确告诉你你的代码哪泄漏了,但是它会给你发现哪泄露的数据和线索。
3.3.1 打开.hprof前可能遇到的问题:
在MAT中打开.prof页面,你可能会遇到一点小挫折:
如上图,可能会弹出 ‘Parsing heap dump from xxx has encountered a proplem’ 的错误弹窗
这是因为文件版本和编辑器能支持的版本有冲突的原因。
解决方案如下:
Sdk安装目录下platform-tools里有一个hprof-conv工具可以解决该问题。在cmd控制台执行:
hprof-conv input.hprof output.hprof
重新再MAT打开output.hprof 就可以打开了~
值得一提的是,如果你dump出的文件太大的话,也有可能发现打不开的现象,这时候,打开安装MAT目录下的MemoryAnalyzer.ini 把-XmX改大些重启即可。但是也不要改得比你机器的可用内存还大,不能太贪心哈哈~
3.3.2 打开.phrof文件后的分析
通过MAT打开.phrof文件后,会弹出Overview 和 Leak Suspects 2个标签页。
Leak Suspects标签页可见如下图:
Leak Suspects视图展示了app内存占用的比例,浅色是空闲的内存,其他是内存占用的空间。每块内存对应的问题也都列在下面。点开每个Problem Suspect下的details,可以看到有哪些类的实例占用了内存和占用大小等信息~
此时我们已经有了怀疑的目标,为了更清晰地查看,我们可以回到Overview页面,打开Histogram页面:
在打开的Histogram标签页中,我们填入检测对象,在列出的匹配项中过滤掉对象的非强引用。
到这里我们就可以看到,是哪个坏蛋hold住了你的对象了。MAT能够给到的支持也就到这里,接下来,还是需要你根据这些线索到代码中寻找判别和修正了~``
腾讯优测(utest.qq.com)是专业的移动云测试平台,为应用、游戏,H5混合应用的研发团队提供产品质量检测与问题解决服务。不仅在线上平台提供「全面兼容测试」、「云手机」等多种质量检测工具,同时在线下为VIP客户配备专家团队,提供定制化综合测试解决方案。真机实验室配备上千款手机,覆盖亿级用户,7*24小时在线运行,为各类测试工具提供支持。
近期热门文章推荐:
每周为你分享来自鹅厂的大神级好文
篇篇精选,不要错过
责任编辑:
声明:本文由入驻搜狐号的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
今日搜狐热点

我要回帖

更多关于 如何排查java内存泄露 的文章

 

随机推荐