Android 内存使用hprof文件打开方法

本文介绍了Java内存泄露的原因及三种引用类型,并详细说明了如何利用Memory Analysis Tool (MAT)进行内存泄露分析的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

与C++的内存不同,C++的内存泄露是由于分配了内存给某程序但是又没有回收造成的。Java的内存泄露则是引用了一些垃圾对象,意思就是说程序引用了某些对象,但是又从来没有使用过。
Jave中的引用分为3种:
强引用:引用为空的时候,Java的垃圾回收器会处理。一般来说自己写的程序大部分都是强引用。
软引用:堆内存不够的时候,Java的垃圾回收器会处理这类引用。
弱引用:Jave的垃圾回收器每次都会回收这类引用。
如何用MAT来分析,前提是Android开发和测试的工具安装完整,SDK,Eclipse:
1.打开Eclipse
2.选择 Help->Install New Software;
3.在Work with中添加站点: http://download.eclipse.org/mat/1.0/update-site/(这个地址可能会变化,但是新的地址可以在官方网站上找到: http://www.eclipse.org/mat/downloads.php  )
4.生成.hprof文件:插入SD卡(Android机器很多程序都需要插入SD卡),并将设备连接到PC,在Eclipse中的DDMS中选择要测试的进程,然后点击Update Heap 和Dump HPROF file两个Button。
.hprof 文件会自动保存在SD卡上,把 .hprof 文件拷贝到PC上的\ android-sdk-windows\tools目录下。这个由DDMS生成的文件不能直接在MAT打开,需要转换。
运行cmd打开命令行,cd到\ android-sdk-windows\tools所在目录,并输入命令hprof-conv xxxxx.hprof yyyyy.hprof,其中xxxxx.hprof为原始文件,yyyyy.hprof为转换过后的文件。转换过后的文件自动放在android-sdk-windows\tools 目录下。
OK,到此为止,.hprof文件处理完毕,可以用来分析内存泄露情况了。
5.打开MAT:
在Eclipse中点击Windows->Open Perspective->Other->Memory Analysis
6.导入.hprof文件
在MAT中点击 File->Open File,浏览到刚刚转换而得到的.hprof文件,并Cancel掉自动生成报告,点击Dominator Tree,并按Package分组,选择自己所定义的Package 类点右键,在弹出菜单中选择List objects->With incoming references。

这时会列出所有可疑类,右键点击某一项,并选择Path to GC Roots->exclude weak/soft references,会进一步筛选出跟程序相关的所有有内存泄露的类。据此,可以追踪到代码中的某一个产生泄露的类。

转自:http://blog.youkuaiyun.com/moruihong/article/details/7677128

 

附注:

这个地址改了:

http://download.eclipse.org/mat/1.0/update-site/ ->

http://archive.eclipse.org/mat/1.0/update-site/

<think>我们正在讨论的是在Android Studio中查看hprof文件。根据引用内容,Android Studio提供了对hprof文件的分析功能。以下步骤将指导用户完成操作: 1. **生成hprof文件**:在Android Studio中,可以通过运行应用并捕获堆转储来生成hprof文件。通常,在运行应用时,点击Android Studio底部的“Profiler”标签,然后选择“Memory”部分,点击“Dump Java heap”按钮即可生成当前内存状态的hprof文件。 2. **定位hprof文件**:生成后,文件会出现在Captures窗口中(通常在左侧边栏)。在Captures窗口的HPROF文件列表中选择文件,右键点击“Show in Explorer”(或Mac上的“Reveal in Finder”),Android Studio会打开文件所在位置[^1]。 3. **在Android Studio中打开分析**:双击Captures窗口中的hprof文件Android Studio会自动打开一个分析视图。这个视图提供了多种分析方式,包括: - **类列表(Class List)**:显示所有类的实例数和内存占用。 - **实例视图(Instance View)**:展示选定类的具体实例。 - **引用树(Reference Tree)**:查看某个实例的引用链,帮助定位内存泄漏。 4. **分析工具的使用**:Android Studio的分析工具提供了几个关键功能: - **直方图(Histogram)**:按类分组显示对象数量和内存占用。 - **支配树(Dominator Tree)**:显示哪些对象占据了大部分内存(按retained size排序)[^3]。 - **查找内存泄漏**:通过查看长时间存在的对象(如Activity实例在onDestroy后仍被引用)来识别泄漏。 5. **高级分析**:如果需要更深入的分析,可以导出hprof文件到MAT(Eclipse Memory Analyzer)或其他工具中。在Captures窗口中右键点击hprof文件,选择“Export to standard .hprof”即可导出。 6. **注意事项**: - 在分析过程中,注意retained size的含义:它表示当该对象被回收时,能释放的内存总量(包括其直接和间接引用的对象)[^3]。 - Android Studio的hprof分析工具比Eclipse DDMS更快,尤其是在处理大型文件时[^2]。 7. **步骤总结**: - 打开Profiler并捕获堆转储。 - 在Captures窗口中找到并双击hprof文件。 - 使用直方图、支配树等视图分析内存使用。 - 通过引用链定位问题对象。 这样,用户就可以在Android Studio中完成hprof文件的基本查看和分析。如果问题复杂,可以导出到MAT进行更深入的分析。 相关问题: 1. 如何在Android Studio中使用Profiler监控内存? 2. 如何通过hprof文件定位Android内存泄漏? 3. Android Studio中的支配树分析有什么作用?</think>### 在Android Studio中查看和分析hprof文件的完整指南 #### 步骤1:生成hprof文件 1. **在Profiler中捕获**: - 运行应用后打开 **Android Profiler**(底部工具栏) - 选择 **Memory** 标签 → 点击 **Dump Java heap** 图标(圆柱形图标) - 生成的文件会自动保存在项目的 `captures/` 目录下[^1] 2. **通过代码触发**: ```java // 在需要捕获的位置添加 Debug.dumpHprofData("/sdcard/dump.hprof"); ``` > 注意:需要`WRITE_EXTERNAL_STORAGE`权限 #### 步骤2:定位和打开hprof文件 1. **文件位置**: - 在 **Captures** 窗口(左侧边栏)查看所有hprof文件 - 右键点击文件 → **Show in Explorer** 定位物理位置[^1] 2. **打开文件**: - 双击Captures窗口中的`.hprof`文件 - 或通过 **File > Open** 选择文件 - 首次打开需等待解析完成(进度条显示) #### 步骤3:使用分析视图(关键功能) ![Android Studio HPROF分析界面](https://developer.android.com/static/studio/images/profiler/hprof-inspector_2x.png) *HPROF分析界面示意图* 1. **类直方图(Class Histogram)**: - 显示所有类及其内存占用 - 关键指标: - **Shallow Size**:对象自身内存 - **Retained Size**:对象+所有引用对象的内存(可回收总量)[^3] - 排序:点击列标题按内存大小排序 2. **实例视图(Instance View)**: - 选择特定类 → 查看所有实例 - 右键实例 → **Jump to Source** 定位到代码 3. **引用树(Reference Tree)**: - 选择实例 → 查看 **References** 标签 - 分析引用链(排查内存泄漏关键) - 区分: - **Incoming References**:谁引用了该对象 - **Outgoing References**:该对象引用了谁 4. **支配树(Dominator Tree)**: - 通过 **View > Tool Windows > Dominator Tree** 开启 - 识别内存占用最大的对象子树 - 特别适合定位潜在内存泄漏点[^3] #### 步骤4:高级分析技巧 1. **对比堆快照**: - 捕获两个时间点的hprof文件 - 右键选择 → **Compare with...** - 分析对象增长趋势(内存泄漏标志) 2. **过滤数据**: - 在搜索框输入类名/包名过滤 - 排除系统类:勾选 **Exclude generated objects** 3. **线程分析**: - 展开 **Threads** 节点 - 查看线程栈和持有对象 - 诊断线程泄漏问题 #### 注意事项 1.文件处理: - 超过1GB的文件建议使用MAT工具分析 - 导出标准hprof:右键 → **Export to standard .hprof** 2. 数据解读要点: - 关注`Activity`/`Fragment`实例是否超过预期数量 - 检查`Bitmap`等大对象的`Retained Size`[^3] - 匿名内部类常是泄漏源(如`Handler`) > 提示:相比Eclipse DDMS,Android Studio的分析速度更快且不易卡顿[^2] #### 替代方案(当AS分析不足时) 1. 导出到MAT: - 右键hprof → **Export to standard .hprof** - 用Eclipse MAT打开进行深度分析 2. 命令行工具: ```bash jhat heapdump.hprof # 启动分析服务器 # 访问 http://localhost:7000 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值