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

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


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

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




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

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

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

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


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

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

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

点击with outgoing references后如图:


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


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

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


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



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

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





猜你喜欢

转载自blog.csdn.net/jbb0403/article/details/74563816