内存频繁gc造成应用onResume黑屏如何优化?

来源:9-3 来说说looper的副业

Jasonton0

2020-12-13

请问一下,我们有个应用A在切换到B放置一段时间不做任何操作,大概半个小时左右,通过应用B再次启动A,就会出现黑屏几秒钟的现象,放置时间越长黑屏越长。这个设备只有1G内存,而且出现问题的时候dumpsys meminfo看到仍然剩下很多内存空间。log里显示是频繁的gc造成的。我怎么去定位和优化这个问题?因为现在不太确定是不是系统其他服务或者应用造成这种内存抖动还是只是应用A的问题,不知道从哪里下手。log如下,希望老师给个指导,谢谢!

12-12 17:09:53.543 D/ViewRootImpl(  765): 320<<<<<< BACK FROM relayoutWM.LayoutParams{(0,0)(fillxfill)mPosX=0mPosY=0mHScale=1.0mVScale=1.0 align=UNDEFINE taskId=28 sim=#120 ty=1 fl=#1810500 fmt=-3 wanim=0x1030001 surfaceInsets=Rect(0, 0 - 0, 0) needsMenuKey=2packageName=com.xtooltech.A30PROtoken=android.os.BinderProxy@10fd1be8}
12-12 17:09:53.572 D/Cocos2dxActivity(  765): onWindowFocusChanged() hasFocus=true
12-12 17:09:53.755 I/art     (  930): Explicit concurrent mark sweep GC freed 122776(4MB) AllocSpace objects, 14(224KB) LOS objects, 24% free, 17MB/23MB, paused 2.815ms total 233.252ms
12-12 17:09:53.925 E/WifiStateMachine(  375): [1,607,764,193,925 ms] noteScanEnd no scan source onTime=0
12-12 17:09:53.937 E/WifiStateMachine(  375): wifi setScanResults statecom.android.server.wifi.WifiStateMachine$DisconnectedState@11a22137 sup_state=SCANNING debouncing=false mConnectionRequests=1 selection=<none>
12-12 17:09:53.978 I/art     (  930): Explicit concurrent mark sweep GC freed 2114(80KB) AllocSpace objects, 0(0B) LOS objects, 24% free, 17MB/23MB, paused 1.291ms total 221.335ms
12-12 17:09:54.127 I/art     (  930): Explicit concurrent mark sweep GC freed 1303(47KB) AllocSpace objects, 0(0B) LOS objects, 24% free, 17MB/23MB, paused 1.181ms total 148.580ms
12-12 17:09:54.166 D/ViewRootImpl(  930): onDetachedFromWindow ungister contentObserver
12-12 17:09:54.181 I/Choreographer(  930): Skipped 43 frames!  The application may be doing too much work on its main thread.
12-12 17:09:54.237 D/--log-- (  930): registerActivityLifecycleCallbacks:onActivityStopped
12-12 17:09:54.239 D/--log-- (  930): registerActivityLifecycleCallbacks:onActivityDestroyed
12-12 17:09:54.393 I/art     (  930): Explicit concurrent mark sweep GC freed 2625(95KB) AllocSpace objects, 0(0B) LOS objects, 25% free, 17MB/23MB, paused 1.213ms total 149.085ms
12-12 17:09:54.517 W/ResourceType(  562): No package identifier when getting value for resource number 0x00000000
12-12 17:09:54.517 W/PackageManager(  562): Failure retrieving resources for com.d.padinitwizard: Resource ID #0x0
12-12 17:09:54.524 I/art     (  930): Explicit concurrent mark sweep GC freed 1255(48KB) AllocSpace objects, 0(0B) LOS objects, 24% free, 17MB/23MB, paused 1.198ms total 130.146ms
12-12 17:09:54.655 I/art     (  930): Explicit concurrent mark sweep GC freed 1113(40KB) AllocSpace objects, 0(0B) LOS objects, 24% free, 17MB/23MB, paused 1.283ms total 130.195ms
12-12 17:09:54.694 D/ViewRootImpl(  930): onDetachedFromWindow ungister contentObserver
12-12 17:09:54.809 I/Choreographer(  930): Skipped 36 frames!  The application may be doing too much work on its main thread.
12-12 17:09:55.991 I/art     (  765): Background partial concurrent mark sweep GC freed 4730(208KB) AllocSpace objects, 329(7MB) LOS objects, 39% free, 11MB/19MB, paused 2.307ms total 104.191ms

写回答

1回答

风语

2021-02-04

这里黑屏应该是主线程太拥挤造成的,所以表现出频繁的gc。对于这种情况,一般是凭经验判断哪里可能存在对象的频繁分配释放,拿不准的话就先禁掉一些可疑的模块来帮助定位。

0
0

剖析Framework面试 冲击Android高级职位

一手助力冲刺Android高级职位,一手把握系统底层原理,理清面试思路,提升技术段位

1406 学习 · 187 问题

查看课程