移动学习 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中的代碼
總結
以上是生活随笔為你收集整理的移动学习 AndroidStudio内存优化分析—hprof文件分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 根据分钟数换算成天/小时/分钟
- 下一篇: cocos2d-x3.2与服务端框架Fi