关于OOM一些信息,求思路

hommilist 2016-04-02 09:46:50
Activity泄露,引用关系如下,求给一些有价值的思路,是什么情况导致OOM
* com.lokinfo.m95xiu.LiveRoomActivity has leaked:
* GC ROOT android.view.Choreographer$FrameDisplayEventReceiver.this$0
* references android.view.Choreographer.mCallbackQueues
* references array android.view.Choreographer$CallbackQueue[].[1]
* references android.view.Choreographer$CallbackQueue.mHead
* references android.view.Choreographer$CallbackRecord.action
* references android.animation.ValueAnimator$AnimationHandler.mAnimations
* references java.util.ArrayList.array
* references array java.lang.Object[].[4]
* references android.animation.ObjectAnimator.mTarget
* references android.widget.ImageView.mContext
* leaks com.lokinfo.m95xiu.LiveRoomActivity instance

请给详细的思路,并在android机制上说明情况,谢谢
...全文
254 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
hommilist 2016-04-11
  • 打赏
  • 举报
回复
引用 5 楼 xingzhong128 的回复:
[quote=引用 3 楼 hommilist 的回复:] [quote=引用 1 楼 xingzhong128 的回复:] 应该是属性动画循环播放导致的内存泄漏,需要在activity onDestroy的时候停止动画播放
是有属性动画,也有循环播放的情况,我一个activity下有好几个属性动画,其中有一些是无限循环的,对于属性动画可能导致的内存泄露,我还需要注意些什么问题,比如监听,在onDestroy我是不是也得把监听清除掉? 如果onDestroy我没有停止动画,在安卓系统机制下导致内存泄露的情况具体是如何形成的?[/quote] 监听也清除掉吧,主要是动画是不停的向主线程的消息队列发送更新界面消息来实现动画展示的,如果你设置了无限播放即使当前activity已经退出了,但是因为handler还在不停向消息队列发送消息,此时动画对象一直都在,而动画对象内部保留了listener引用,这些监听器对象通常都是activity的内部对象,它们隐含的包含了外部activity的强引用,所以无法释放activity。
引用 3 楼 hommilist 的回复:
[quote=引用 1 楼 xingzhong128 的回复:] 应该是属性动画循环播放导致的内存泄漏,需要在activity onDestroy的时候停止动画播放
是有属性动画,也有循环播放的情况,我一个activity下有好几个属性动画,其中有一些是无限循环的,对于属性动画可能导致的内存泄露,我还需要注意些什么问题,比如监听,在onDestroy我是不是也得把监听清除掉? 如果onDestroy我没有停止动画,在安卓系统机制下导致内存泄露的情况具体是如何形成的?[/quote] 属性动画的执行的Handler是一个static的handler,这个handler内部会有各种等待被执行的动画(如果动画是循环的,那么这个引用会一直都在),而注册了监听的动画那些监听对象实际上是activity的内部对象,它们会自动拥有外部activity的引用,因为没有cancel掉循环动画,所以这些引用链就属于强引用链,不会被回收[/quote] 说得很清楚,谢谢!
hommilist 2016-04-06
  • 打赏
  • 举报
回复
引用 2 楼 Perfect411_111 的回复:
用mat工具查一查
我上面贴出来的堆栈引用,就是mat工具复制出来的,但是涉及到的类都是系统层的,所以不了解当中形成这种引用关系的原因
hommilist 2016-04-06
  • 打赏
  • 举报
回复
引用 1 楼 xingzhong128 的回复:
应该是属性动画循环播放导致的内存泄漏,需要在activity onDestroy的时候停止动画播放
是有属性动画,也有循环播放的情况,我一个activity下有好几个属性动画,其中有一些是无限循环的,对于属性动画可能导致的内存泄露,我还需要注意些什么问题,比如监听,在onDestroy我是不是也得把监听清除掉? 如果onDestroy我没有停止动画,在安卓系统机制下导致内存泄露的情况具体是如何形成的?
xingzhong128 2016-04-06
  • 打赏
  • 举报
回复
引用 3 楼 hommilist 的回复:
[quote=引用 1 楼 xingzhong128 的回复:] 应该是属性动画循环播放导致的内存泄漏,需要在activity onDestroy的时候停止动画播放
是有属性动画,也有循环播放的情况,我一个activity下有好几个属性动画,其中有一些是无限循环的,对于属性动画可能导致的内存泄露,我还需要注意些什么问题,比如监听,在onDestroy我是不是也得把监听清除掉? 如果onDestroy我没有停止动画,在安卓系统机制下导致内存泄露的情况具体是如何形成的?[/quote] 监听也清除掉吧,主要是动画是不停的向主线程的消息队列发送更新界面消息来实现动画展示的,如果你设置了无限播放即使当前activity已经退出了,但是因为handler还在不停向消息队列发送消息,此时动画对象一直都在,而动画对象内部保留了listener引用,这些监听器对象通常都是activity的内部对象,它们隐含的包含了外部activity的强引用,所以无法释放activity。
引用 3 楼 hommilist 的回复:
[quote=引用 1 楼 xingzhong128 的回复:] 应该是属性动画循环播放导致的内存泄漏,需要在activity onDestroy的时候停止动画播放
是有属性动画,也有循环播放的情况,我一个activity下有好几个属性动画,其中有一些是无限循环的,对于属性动画可能导致的内存泄露,我还需要注意些什么问题,比如监听,在onDestroy我是不是也得把监听清除掉? 如果onDestroy我没有停止动画,在安卓系统机制下导致内存泄露的情况具体是如何形成的?[/quote] 属性动画的执行的Handler是一个static的handler,这个handler内部会有各种等待被执行的动画(如果动画是循环的,那么这个引用会一直都在),而注册了监听的动画那些监听对象实际上是activity的内部对象,它们会自动拥有外部activity的引用,因为没有cancel掉循环动画,所以这些引用链就属于强引用链,不会被回收
Perfect411_111 2016-04-03
  • 打赏
  • 举报
回复
用mat工具查一查
xingzhong128 2016-04-03
  • 打赏
  • 举报
回复
应该是属性动画循环播放导致的内存泄漏,需要在activity onDestroy的时候停止动画播放

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧