windows 怎么检查内存泄漏

windows 怎么检查内存泄漏,第1张

Windows

内存诊断程序可以诊断内存泄漏,它会测试计樱瞎答算机随机存取内存(RAM)是否存在错误,包括一组综合性的内存测试。Windows

内存诊断程序容易使用并且速度快,如果运行

Windows

遇到了问题,可神野以使用此诊断程序查清问题是否由损坏的硬件所导致的。

还有一个很简单的办法来检查一个程序是否有内存泄漏。就是是用Windows的任务管理器(Task

Manager)。运行程序,然后在任务管理器里面查看

“内存使用”和脊慧”虚拟内存大小”两项,当程序请求了它所需要的内存之后,如果虚拟内存还是持续的增长的话,就说明了这个程序有内存泄漏问题。

当然如果内存泄漏的数目非常的小,用这种方法可能要过很长时间才能看的出来。

(1) *** 作Bitmap对象,一定要注意,在不使用的时候 recycle

(2) 访问数据库,一定要记得关闭游标

(3) 涉及JNI层的代码,由于JNI层是采用C/C++编写,需要自己管理内存的分配/回收,所以要慎重小心。

那么,Android开发中,有什么有效的方法可以检测内存使用情况以及内存泄漏呢?

这里主要介绍型橡三种方法:

1. 程序的Log信息

程序在进行垃圾回收的时候,会打印一条Log信息(logcat窗口),例如:

D/dalvikvm( 9050): GC_CONCURRENT freed 2049K, 65% free 3571K/9991K, external 4703K/5261K, paused 2ms+2ms

注意这条信息中的 “ 3571K/9991K” 值,这代表着程序使用的heap大小,如果这个值一直在增加,而从来不减小,那么就代表着你的程序存在着内存泄漏。

2. DDMS的Heap信息

Eclipse开发环境还提供了一种更加直观的方法来查看App的Heap信息, *** 作方式如下:

(1) 连接手机,运行程序,假设是 com.ticktick.test 程序

(2) 点击DDMS按钮,在左侧的Device窗口选中你要检测的程序(com.ticktick.test )

(3) 点击Device窗口工具栏的第二个图标(Update Heap),

(4) 点击右边的窗口的Cause GC按钮,即可得到当前程序的Heap信息

同样,随着程序的运行,卜行旁多次点击得到的Heap大小,如果只增不减的话,也昭示着你的程序有内存泄漏。

3. adb命令查看内存信息

其实,最全面最简单的方式还是用adb命令来查看程序的内存占用和内存泄漏情况,打开命令行窗口,adb命令的格式如下:

adb shell dumpsys meminfo <package_name>

其中带桐,package_name 也可以换成程序的pid,pid可以通过 adb shell top | grep app_name 来查找,在命令行窗口运行上述命令,得到的我的 com.ticktick.test 程序的内存情况如下所示:

这里得到的信息非常多,重点关注如下几个字段:

(1) Native/Dalvik 的 Heap 信息

具体在上面的第一行和第二行,它分别给出的是JNI层和Java层的内存分配情况,如果发现这个值一直增长,则代表程序可能出现了内存泄漏。

(2) Total 的 PSS 信息

这个值就是你的应用真正占据的内存大小,通过这个信息,你可以轻松判别手机中哪些程序占内存比较大了。

4. 总结

关于Android开发中内存的使用情况和内存泄漏的检测就简单介绍到这里,基本上用以上三种方式都能够定位内存泄漏问题,平时在使用Bitmap,数据库和JNI层C/C++编程的时候,注意一点就行。另外,如果想深入了解文中的一些详细内容,可以参考Google官方提供的两篇文章,它们有着更详细的论述《Investigating Your RAM Usage》,《Managing Your App Memory》,有任何疑问或者不清楚的地方,欢迎留言或者来信[email protected]交流。

ios怎么查看内存泄露,有以下几种方法供大家参考:

1.静态分析源尺

通过静态分析我们可以最初步的了解到代码的一些不规范的地方或者是存在的内存泄漏,这是我们第一步对内存泄漏的检测。当然有一些警告并不是我们关心的可以略过。

2.通过instruments来检查内存泄漏

这个方法能粗略的定位我们在哪里发生了内存泄漏。方法是完成一个循环 *** 作,如果内存增长为0就证明我洞行们程序在该次循环 *** 作中不存在内存泄漏,如果内存增长不为0那证明有可能存在内存泄漏,当然具体问题需要具体分析。

3.代码测试内存泄漏

在做这项工作之前我们要注意一下,在dealloc的方法中我们是否已经释放了该对象所拥有的所有对象。观察对象的生成和销毁是否配对。准确的说就是init(创建对象的方法)和dealloc是否会被成对触发(简单说来就是走一次创建对象就有走一次dealloc该对象)。

下面是自己遇到的一些比较隐秘的造成内存泄漏的情况:

1.两个对象互相拥有:也就是说对象a里面retain/addSubview了b对象,b对象同时也retain/addSubView了a对象。注意:delegate不要用retain属性,要用assign属性也会导致互相拥有。

2.有时候需要用removeFromSuperView来释放:具体说明,也许我的a对象拥有一个b对象,b对象add到了c对象上,而在我们的设计中b对象的生命周期应该和a对象相同;这时候只一句[b

release]/self.b

=

nil是不能把b对象释放纳裂哗掉的(一般情况下release会使其retainCount-1,[super

dealloc]会再次将所有subView的retainCount-1,而b并不是a的subView,所有最后的一次-1没有了);所以我们需要在之前加上[b

removeFromSuperView]。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12412816.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存