当前位置:首页 > 内存 > 正文

内存泄漏定位(anonpage内存泄漏)

  • 内存
  • 2024-09-04 20:27:31
  • 1576

一、如何定位的内存泄漏1、查找漏洞的工具:
工欲善其事,必先利其器。在调试的时候,我们还是需要一些工具。
devTool
这是今年年初发布的调试工具。它基于Electron并集成了和Chromium的功能。它比节点检查器操作起来更方便,并且打开时间轴功能相当方便,尽管不是实时显示。
只需要,也可以通过.devtoolrc自定义参数,具体参见GitHub
heapdump+chromedevTool
这是比较传统的查找内存泄漏的组合。代码中可以直接调用Heapdump生成内存快照,然后将快照文件导入chromedevTool中进行分析。后面的操作和前面几乎一样。不过这个方案与前者的一个区别在于,前者实际上还是在浏览器环境中,所以生成的内存镜像会有一些DOM对象,会造成一定的扰动。该方案直接调用底层V8方法,生成的快照只有环境中的对象。
memwatch
这可以直接在代码中使用来实时检测内存动态。当发生内存泄漏时,将触发“leak”事件,并使用heapdump发送当前堆状态。
2.位置问题:
如果您使用的是devTool,则可以忽略以下过程:
打开ChromeDevtools,转到Profiler选项卡,单击“加载”按钮并加载之前生成的快照。
对于内存快照,有四种视图:摘要、比较、包含和统计。这里经常使用前三种。
在摘要视图中,我们可以看到当前快照的所有信息,以及多个快照之间的信息。列表中显示的是对象的构造函数名称。你可以先忽略括号里的对象,先观察其他对象,最后再看它们。下面的basesize代表对象本身的大小,retainedsize代表对象及其依赖对象的大小,这些对象通常无法被GC获取。
在比较视图中,我们可以比较多个快照,这非常有用,如果我们比较前两个快照,我们可以快速找到有问题的对象。注意New、Deleted和Delta如果存在内存泄漏对象,它可能是New而不是Deleted。
在Containment视图中我们可以看到整个GC路径,当然这通常不被使用。因为通过展开“SummaryandComparison”中列出的每一项,您可以看到从GCroots到该对象的路径。通过这些路径你可以看到是什么持有这个对象的句柄,从而找到问题的原因。值得注意的是,背景颜色为黄色,这意味着该对象在Javascript中仍然有引用,因此可能不会被删除。如果它是红色的,则意味着该对象在Javascript中没有引用,但在的DOM对象中仍然很常见。


二、如何快速定位androidapp是否存在内存泄露1.首先确定是否存在内存泄漏以及是哪个程序导致的。
1.1.内存泄漏导致出现内存不足对话框。
这种情况很简单,只要看一下对话框就知道是哪个应用程序出现了问题。接下来,分析您的应用程序是否导致内存泄漏
内存不足对话框。分析
中介绍的各种方法来判断是否存在内存泄漏以及是哪个进程导致内存泄漏。
2.生成hprof文件并用MAT进行分析。
选择进程,点击窗口左上角的dumphprofile按钮,可以直接在DDMS中生成hprof文件。或者,您可以通过在程序中添加代码来生成代码2:voidgenerateHprof(){StringpackageName=getApplicationInfo().packageName;
StringhpFilePath=/data/data/+packageName+/input;try{//rofData(/sdcard/);调试。
dumpHprofData
(hpFilePath);}catch(IOExceptione){//TODOAuto-generatedcatchblock
tackTrace();}}使用代码“
MAT会自动解析并生成报告。
DominatorTree
单击按包分组,选择您定义的包类,并比较每个类的性能。在不同的时间段运行RetainedHeap
,找到可疑的类,选择该类,右键单击并选择showretainedSet项。了解有关RetainedHeap的更多信息
以查找更多可疑项目。
3.查找代码中的内存泄漏。
根据MAT中发现的内存泄漏信息,请参阅
Android内存泄漏概述
进一步找出并解决内存泄漏的原因。
另外,如果您的代码非常简单,可以直接参考
Android内存泄漏简介
查找并解决内存泄漏的原因。