游戲在bugly上內(nèi)存OOM越來(lái)越嚴(yán)重,因此,近期對(duì)內(nèi)存進(jìn)行優(yōu)化。從java層的內(nèi)存進(jìn)行優(yōu)化開始,通過(guò)LeakCannary或者adb shell 獲取到內(nèi)存快照,發(fā)現(xiàn)好幾處內(nèi)存泄漏點(diǎn)。
1.單例類持有Activity:
查看內(nèi)存快照,該閃屏頁(yè)面Activity(包含引用對(duì)象)可回收3.8M的內(nèi)存;
LeakCannary的內(nèi)存分析也證明了該對(duì)象占用的內(nèi)存大小,持有1380對(duì)象。
持有關(guān)系:context.getContentResolver()注冊(cè)ContentObserver-->Activity的匿名內(nèi)部類Listener -->splashActivity。
解決方式:將匿名外部類,設(shè)置外部類或者挪動(dòng)到其他類中設(shè)置。
2.屏幕方向?qū)е翧ctivity被持有
WXPayEntryActivity的屏幕選擇導(dǎo)致的內(nèi)存泄漏:查看ActivityThread中源碼:
接著繼續(xù),看下是什么情況下會(huì)調(diào)用:
打開微信是豎屏顯示,而游戲是橫屏顯示,因此當(dāng)微信界面關(guān)閉后,會(huì)到游戲進(jìn)程中創(chuàng)建Activity時(shí),需調(diào)整屏幕,會(huì)調(diào)用 overrideApplicationDisplayAdjustments()
矯正。
接著查看,手機(jī)系統(tǒng),發(fā)現(xiàn)屏幕設(shè)置是自動(dòng)旋轉(zhuǎn)。
再來(lái)查看下WXPayEntryActivit的屏幕配置是默認(rèn):
解決方式:加上android:screenOrientation="sensorLandscape"
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-608147.html
3.Activity作為context被系統(tǒng)類持有
在廣告頁(yè)面的Activity 被GestureBoostManager持有,解決方案,是使用Appliction 作為context 去獲取系統(tǒng)類。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-608147.html
建議:
- 盡量避免持有Activity ,盡量使用Application(除開dialog外);
- 使用Acitivity中使用 匿名內(nèi)部類(避免:new Listener)等,在Ondestory()中要移除,避免匿名內(nèi)部類持有Activity導(dǎo)致內(nèi)存泄漏
- 避免將Activity有關(guān)的屬性或者持有的activity的對(duì)象設(shè)置成static ,避免造成內(nèi)存泄漏;
到了這里,關(guān)于Android性能優(yōu)化之修復(fù)游戲中內(nèi)存泄漏(java層)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!