笔记-内存泄漏

    技术2022-08-11  92

    leakCanary原理:创建weakReference的时候可以传入一个自定义的ReferenceQueue,当WeakReference被回收时,WeakReference的引用就会传入到queue中。我们创建activity的时候,创建一个WeakReference包含自定义哥的queue指向它,并使用一个set去保存这些WeakReference,当activity被销毁的时候(onDestroy),执行GC,再通过回调遍历所有的queue,并将set中包含被遍历的引用删除,此时还留在set中的就是内存泄漏的activity

    for(Item item :set){        if(queue.contains(item)){                 set.delete(item);        } } return set; 伪代码如上

     

    Vsync信号每次只能触发一次以减少触发绘制的操作,比如,setText,或者invalidate都会触发scheduleTraversals,然后订阅Vsync信号,即nativeScheduleVsync。动画是在上一帧绘制完成后,立刻再进行一次Vsync订阅,即完成屏幕的不断绘制

    Choreographer: 承上:接受应用的callback输入,包括input,animation,traversal绘制,缓存在Choreographer中的CallbackQueue中。 启下:内部FrameDisplayEventReceiver会接收硬件层发出的vsync信号,接收到该信号->onVsync->doFrame->doCallback将      缓存的TraversalRunnable取出并调用它的run

    Choreographer.getInstance().postFrameCallback添加自定义callback,监听doFrame的执行时间,进而判断是否发生丢帧

     

    Processed: 0.016, SQL: 9