
文章插图
4.标记复制:算法分标记-复制两个阶段 。首先会标记存活的对象 , 完成后 , 该算法会把存活的对象都复制到一块新的空内存里去 。最后将原来的内存空间清空 。过程如下图 , 这个算法最大的问题就是需要很大的内存(实际用地 , 用于复制的内存空间) , 同时如果存活的对象非常多的话 , 标记和复制阶段都就会很慢 。同时也涉及到了对象位置改变需要更新引用 。尽管看起来问题很大 , 但是根据分代理论:弱分代假说里大多数对象生命周期短 , 这种情况下标记复制就很适合了(复制的存活对象少) 。至于内存消耗太大的问题 , java虚拟机通过将新生代分为一个Eden区与2个Survivo区 , 其中一个Survivo区用来复制 , 这样一来极大地提高了内存空间利用率 。

文章插图
了解到GC的原理以及他的算法 , 我们就来看看如何解决问题 。
四、解决方案打开著名的traceview工具 , 也是分析性能问题的好帮手 。同样使用DDMS工具上集成的方式 , 我使用的是MTK release的工具GAT首先我用traceView看了一下 , traceview主要是看一些方法的耗时和调用情况 , 以及消耗cpu的状态 , 从函数方法的调用来看 , 耗时最高的就是主线程 , 达到了4.7秒 , 图形上看 , 似乎这个Binder操作耗费的时间有点高 。

文章插图
双击这一块看到信息 , Binder操作的inc cpu time占用14% , 但是incl Real Time是73%的时间 , 达到了5秒多 , 这种情况主要是因为可能CPU的上下文切换、阻塞、GC等原因造成 , 与systrace上看出的问题一致 , 如图:

文章插图
下面再录制一份log , 找关键字ActivityManager和Binder看看情况 , 找到如下log:
01-21 14:07:49.951 1109 1285 I ActivityManager: Displayed com.android.settings/.SubSettings: +5s544ms [aosp]可见 , 这个subSetting花了5秒半 , 相当长 , 循着时间往前看5s , 看看是否有什么蛛丝马迹 , 找到了binder出错的信息:01-21 14:07:43.931 4218 4218 E ActivityThread: Activity com.android.settings.SubSettings has leaked ServiceConnection com.android.settings.password.ChooseLockGeneric$ChooseLockGenericFragment1 @ 680 f 7 e 9 t h a t w a s o r i g i n a l l y b o u n d h e r e 01 − 2114 : 07 : 43.93142184218 E A c t i v i t y T h r e a d : a n d r o i d . a p p . S e r v i c e C o n n e c t i o n L e a k e d : A c t i v i t y c o m . a n d r o i d . s e t t i n g s . S u b S e t t i n g s h a s l e a k e d S e r v i c e C o n n e c t i o n c o m . a n d r o i d . s e t t i n g s . p a s s w o r d . C h o o s e L o c k G e n e r i c 1@680f7e9 that was originally bound here 01-21 14:07:43.931 4218 4218 E ActivityThread: android.App.ServiceConnectionLeaked: Activity com.android.settings.SubSettings has leaked ServiceConnection com.android.settings.password.ChooseLockGeneric1@680f7e9thatwasoriginallyboundhere01−2114:07:43.93142184218EActivityThread:android.app.ServiceConnectionLeaked:Activitycom.android.settings.SubSettingshasleakedServiceConnectioncom.android.settings.password.ChooseLockGenericChooseLockGenericFragment1 @ 680 f 7 e 9 t h a t w a s o r i g i n a l l y b o u n d h e r e 01 − 2114 : 07 : 43.93142184218 E A c t i v i t y T h r e a d : a t a n d r o i d . a p p . L o a d e d A p k 1@680f7e9 that was originally bound here 01-21 14:07:43.931 4218 4218 E ActivityThread: at android.app.LoadedApk1@680f7e9thatwasoriginallyboundhere01−2114:07:43.93142184218EActivityThread:atandroid.app.LoadedApkServiceDispatcher.(LoadedApk.java:1532)01-21 14:07:43.931 4218 4218 E ActivityThread: at android.app.LoadedApk.getServiceDispatcher(LoadedApk.java:1424)01-21 14:07:43.931 4218 4218 E ActivityThread: at android.app.ContextImpl.bindServiceCommon(ContextImpl.java:1605)01-21 14:07:43.931 4218 4218 E ActivityThread: at android.app.ContextImpl.bindService(ContextImpl.java:1557)01-21 14:07:43.931 4218 4218 E ActivityThread: at android.content.ContextWrapper.bindService(ContextWrapper.java:684)01-21 14:07:43.931 4218 4218 E ActivityThread: at com.android.settings.password.ChooseLockGenericC h o o s e L o c k G e n e r i c F r a g m e n t . b i n d S e r v i c e ( C h o o s e L o c k G e n e r i c . j a v a : 297 ) 01 − 2114 : 07 : 43.93142184218 E A c t i v i t y T h r e a d : a t c o m . a n d r o i d . s e t t i n g s . p a s s w o r d . C h o o s e L o c k G e n e r i c ChooseLockGenericFragment.bindService(ChooseLockGeneric.java:297) 01-21 14:07:43.931 4218 4218 E ActivityThread: at com.android.settings.password.ChooseLockGenericChooseLockGenericFragment.bindService(ChooseLockGeneric.java:297)01−2114:07:43.93142184218EActivityThread:atcom.android.settings.password.ChooseLockGenericChooseLockGenericFragment.onCreate(ChooseLockGeneric.java:201)01-21 14:07:43.931 4218 4218 E ActivityThread: at android.app.Fragment.performCreate(Fragment.java:2489)01-21 14:07:43.931 4218 4218 E ActivityThread: at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1237)01-21 14:07:43.931 4218 4218 E ActivityThread: at android.app.FragmentManagerImpl.addAddedFragments(FragmentManager.java:2407)01-21 14:07:43.931 4218 4218 E ActivityThread: at android.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2186)01-21 14:07:43.931 4218 4218 E ActivityThread: at android.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2142)01-21 14:07:43.931 4218 4218 E ActivityThread: at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2043)01-21 14:07:43.931 4218 4218 E ActivityThread: at android.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:799)01-21 14:07:43.931 4218 4218 E ActivityThread: at com.android.settings.SettingsActivity.switchToFragment(SettingsActivity.java:781)01-21 14:07:43.931 4218 4218 E ActivityThread: at com.android.settings.SettingsActivity.launchSettingFragment(SettingsActivity.java:439)01-21 14:07:43.931 4218 4218 E ActivityThread: at com.android.settings.SettingsActivity.onCreate(SettingsActivity.java:327)01-21 14:07:43.931 4218 4218 E ActivityThread: at android.app.Activity.performCreate(Activity.java:7023)01-21 14:07:43.931 4218 4218 E ActivityThread: at android.app.Activity.performCreate(Activity.java:7014)01-21 14:07:43.931 4218 4218 E ActivityThread: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1215)01-21 14:07:43.931 4218 4218 E ActivityThread: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2734)01-21 14:07:43.931 4218 4218 E ActivityThread: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2859)01-21 14:07:43.931 4218 4218 E ActivityThread: at android.app.ActivityThread.-wrap11(Unknown Source:0)01-21 14:07:43.931 4218 4218 E ActivityThread: at android.app.ActivityThreadH . h a n d l e M e s s a g e ( A c t i v i t y T h r e a d . j a v a : 1592 ) 01 − 2114 : 07 : 43.93142184218 E A c t i v i t y T h r e a d : a t a n d r o i d . o s . H a n d l e r . d i s p a t c h M e s s a g e ( H a n d l e r . j a v a : 106 ) 01 − 2114 : 07 : 43.93142184218 E A c t i v i t y T h r e a d : a t a n d r o i d . o s . L o o p e r . l o o p ( L o o p e r . j a v a : 164 ) 01 − 2114 : 07 : 43.93142184218 E A c t i v i t y T h r e a d : a t a n d r o i d . a p p . A c t i v i t y T h r e a d . m a i n ( A c t i v i t y T h r e a d . j a v a : 6518 ) 01 − 2114 : 07 : 43.93142184218 E A c t i v i t y T h r e a d : a t j a v a . l a n g . r e f l e c t . M e t h o d . i n v o k e ( N a t i v e M e t h o d ) 01 − 2114 : 07 : 43.93142184218 E A c t i v i t y T h r e a d : a t c o m . a n d r o i d . i n t e r n a l . o s . R u n t i m e I n i t H.handleMessage(ActivityThread.java:1592) 01-21 14:07:43.931 4218 4218 E ActivityThread: at android.os.Handler.dispatchMessage(Handler.java:106) 01-21 14:07:43.931 4218 4218 E ActivityThread: at android.os.Looper.loop(Looper.java:164) 01-21 14:07:43.931 4218 4218 E ActivityThread: at android.app.ActivityThread.main(ActivityThread.java:6518) 01-21 14:07:43.931 4218 4218 E ActivityThread: at java.lang.reflect.Method.invoke(Native Method) 01-21 14:07:43.931 4218 4218 E ActivityThread: at com.android.internal.os.RuntimeInitH.handleMessage(ActivityThread.java:1592)01−2114:07:43.93142184218EActivityThread:atandroid.os.Handler.dispatchMessage(Handler.java:106)01−2114:07:43.93142184218EActivityThread:atandroid.os.Looper.loop(Looper.java:164)01−2114:07:43.93142184218EActivityThread:atandroid.app.ActivityThread.main(ActivityThread.java:6518)01−2114:07:43.93142184218EActivityThread:atjava.lang.reflect.Method.invoke(NativeMethod)01−2114:07:43.93142184218EActivityThread:atcom.android.internal.os.RuntimeInitMethodAndArgsCaller.run(RuntimeInit.java:438)01-21 14:07:43.931 4218 4218 E ActivityThread: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)01-21 14:07:43.987 1109 3345 W ActivityManager: Unbind failed: could not find connection for android.os.BinderProxy@8d5f5b4
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 港剧是tvb吗,港剧除了tvb还有啥-
- AMD|AMD游戏神U锐龙7 5800X3D再升级:免费解锁5%额外性能
- 安卓手机如何打开.null文件
- 电动车|小鹏P7出事故气囊未弹出 官方回应:事发后车门可解锁打开
- 奔驰|奔驰推出付费解锁后轮转向功能:4998元/年
- 一文读懂 Android 系统的源代码
- 原生javascript解锁恶心的CSDN强制关注才能阅读让文章自动展开
- 口红|5年磨一剑|优酷Android包瘦身治理思路全解
- 新飞冰箱触摸屏怎样解锁 新飞冰箱触摸屏如何解锁
- Pixel|第一款Android 13高端旗舰已在路上 谷歌Pixel 7 Pro参数曝光
