1、移动学习在主界面时按如下顺序点击:

移动学习 AndroidStudio内存优化分析—hprof文件分析

2、其实和 android内存分析 outOfMemoryError错误定位及分析策略(非显示图片造成) 中用eclipse前7步的设置一样,只不过这个速度更快一些,更方便一些(eclipse ddms模式下卡的要死要死~~~~)

3、用mat for mac(下载地址:http://www.eclipse.org/mat/downloads.php) 打开hprof文件:

移动学习 AndroidStudio内存优化分析—hprof文件分析

移动学习 AndroidStudio内存优化分析—hprof文件分析

移动学习 AndroidStudio内存优化分析—hprof文件分析

4、按Shallow Heap降序排列后,如上图所示 

Shallow Heap代表:对象本身占用内存的大小,不包含其引用的对象。

Retain Heap代表:如果这个对象被释放掉,那会因为该对象的释放而减少引用进而被释放的所有的对象大小。

直观的说就是MainNewActivity占了312字节的内存,如果被释放掉的话它所持有的对象也会被释放掉共大于等于2888字节内存。

移动学习 AndroidStudio内存优化分析—hprof文件分析

5、在MainNewActivity右键->List Objects会出现两个选项:with outgoing references 和 with incoming references

with outgoing references是指 被该对象引用的对象 (这个对象持有了哪个对象)

with incoming references是指 引用到该对象的对象(哪个对象持有了该对象)

点击with outgoing references后如图:

移动学习 AndroidStudio内存优化分析—hprof文件分析

6、显示出MainNewActivity所持有的所有成员变量,activityInfo的所有信息等等,点击其中的termEnd右键with incoming references,列出所有持有该对象的对象:

移动学习 AndroidStudio内存优化分析—hprof文件分析

7、即可看到LoadActivity、SettingsActivity、LoginActivity都持有该变量(该变量写在了BaseActivity里),大问题啊,改!

8、GC Roots:调用该对象的根节点,例子如图:

移动学习 AndroidStudio内存优化分析—hprof文件分析

9、如果在object4上右键 path to GCRoot -> exclude all phantom/weak/soft etc. references(去除所有的虚引用,弱引用,软引用) 就会得到调用该类的跟节点gc root,例如:

移动学习 AndroidStudio内存优化分析—hprof文件分析

移动学习 AndroidStudio内存优化分析—hprof文件分析

10、可以看出是在DBManagerHelper中实例化sqliteOpenHelper时初次调用了sqliteOpenHelper。此方法在查询对象在哪里最初被调用或持有非常好使。

11、移动学习进入主程序后,LoadActivity理应被释放,但是还常驻内存,查了一下incoming references,发现是common.commonContext对象持有了该对象,造成了内存泄漏,修改LoadActivity和BaseActivity中的代码





相关文章:

  • 2022-01-06
  • 2021-04-27
  • 2021-10-25
  • 2021-04-27
  • 2021-12-12
  • 2022-12-23
  • 2021-06-04
  • 2021-11-09
猜你喜欢
  • 2021-11-14
  • 2022-12-23
  • 2022-01-19
  • 2021-11-15
  • 2021-08-03
  • 2021-06-23
  • 2022-01-03
相关资源
相似解决方案