皮皮网

【gtest源码分析】【flash 拖动源码】【kdj优化源码】leakcanary 源码

2024-11-23 12:39:10 来源:zblog文章源码

1.leakcanary Դ?源码?
2.探索Android开源框架 - 7. LeakCanary使用及源码解析
3.性能优化修复内存泄漏和大对象占用问题后, OOM 依旧未达到正常标准

leakcanary 源码

leakcanary Դ??

       Android操作系统,自Andy Rubin开发以来,源码逐渐由Google收购并拓展至包括智能手机、源码平板电脑在内的源码多个领域,以其免费、源码智能和开放性在全球市场份额中占据重要地位。源码gtest源码分析

       Android系统庞大,源码学习内容繁杂,源码本文将通过八大模块深入讲解,源码旨在带领初学者全面了解Android系统架构及其运作机制,源码构建坚实的源码技术基础。

       架构师筑基必备技能

       深入理解Java泛型

       注解使用详解

       并发编程实践

       数据传输与序列化技术

       Java虚拟机原理探索

       高效IO操作

       Android百大框架源码解析

       Retrofit 2.0源码剖析

       Okhttp3源码解读

       ButterKnife源码解析

       MPAndroidChart源码解析

       Glide源码解析

       Leakcanary源码分析

       Universal-image-loader源码详解

       EventBus 3.0源码解析

       ZXing源码分析

       Picasso源码解析

       LottieAndroid使用详解与源码解析

       Fresco源码分析——加载流程

       Android性能优化实战解析

       腾讯Bugly:深入理解字符串匹配算法

       爱奇艺:安卓APP崩溃捕获方案

       字节跳动:深入理解Gradle框架

       百度APP技术:Android H5首屏优化实践

       支付宝客户端架构解析:Android客户端启动速度优化

       携程:组件化架构实践

       网易新闻构建优化:构建速度提升策略

       高级Kotlin强化实战

       Kotlin入门教程

       Kotlin实战避坑指南

       项目实战《Kotlin Jetpack 实战》

       Android高级UI开源框架进阶解密

       SmartRefreshLayout使用与实践

       Android PullToRefresh控件源码解析

       Android-PullToRefresh下拉刷新库基本用法

       LoadSir-高效易用的源码加载反馈页管理框架

       Android通用LoadingView加载框架详解

       MPAndroidChart实现LineChart(折线图)

       hellocharts-android使用指南

       SmartTable使用指南

       开源项目android-uitableview介绍

       ExcelPanel使用指南

       Android开源项目SlidingMenu解析

       MaterialDrawer使用指南

       NDK模块开发

       NDK模块开发入门

       JNI模块实践

       Native开发工具介绍

       Linux编程基础

       底层处理技术

       音视频开发教程

       机器学习应用入门

       Flutter技术进阶

       Flutter跨平台开发概览

       Windows中Flutter开发环境搭建

       编写Flutter APP实操

       Flutter开发环境搭建与调试

       Dart语法基础解析

       Dart语法进阶与源码分析

       微信小程序开发

       小程序入门指南

       小程序UI设计与实现

       API操作详解

       购物商场项目实战

       本文内容涵盖Android系统架构、源码解析、源码flash 拖动源码性能优化、源码Kotlin强化、源码UI框架、NDK开发、Flutter技术、微信小程序等多个方面,旨在帮助初学者全面深入地了解Android系统开发全貌,构建坚实的技术栈。

探索Android开源框架 - 7. LeakCanary使用及源码解析

       简介

       LeakCanary2.x 使用,添加依赖,如何确定内存泄露的对象,为什么 LeakCanary 不能用于线上,kdj优化源码源码解析:AppWatcherInstaller,AppWatcherInternal,LeakCanaryHeapAnalyzer,Service

       我是今阳,如果想要进阶和了解更多的干货,欢迎关注微信公众号 “今阳说”,接收我的最新文章。

性能优化修复内存泄漏和大对象占用问题后, OOM 依旧未达到正常标准

       概述

       在线监控发现OOM涨幅较大,定位修复内存泄漏和大对象占用问题后,仍未能达到正常标准。在新上报的hprof文件中发现,几乎所有案例中都有名为FinalizerReference的slides源码分析对象,数量庞大,内存占用高居榜首,判断其为引起OOM上涨的主因。

       ReferenceQueue

       ReferenceQueue是一个存放Reference对象的队列,当Reference对象所引用的对象被GC回收时,该Reference对象会被加入到引用队列中。例如,创建一个bean强引用与一个reference软引用,当bean被回收时,软引用reference对象会被加入queue队列,开发者需自行处理。Leakcanary检测内存泄漏原理基于应用的dni指标源码ReferenceQueue引用队列,例如Activity的引用队列。

       FinalizerReference

       介绍Finalizer对象,指在其Java类中复写了finalize()方法且非空的对象,称作f类。类加载过程中会标记加载的Java类是否为f类。

       FinalizerReference概述

       FinalizerReference是协助FinalizerDaemon线程处理对象finalize()工作的工具。它通过FinalizerReference类创建链表,每个FinalizerReference对象使用ReferenceQueue创建,当对应对象Object referent被回收后,该FinalizerReference会放入ReferenceQueue。

       FinalizerReference.add

       FinalizerReference.add方法由虚拟机调用,创建对象时发现该类为f类,调用此方法创建FinalizerRefence对象并加入到头链表中。

       FinalizerReference.remove

       当f类对象发生GC时,其对应的FinalizerReference对象会被加入FinalizerReference.queue队列,remove时机与FinalizerDaemon守护线程相关。FinalizerDaemon.runInternal方法通过queue的poll/remove方法获取queue中的Reference引用,执行doFinalize方法调用Finalizer对象的finalize()方法。

       小结

       FinalizerReference主要协助FinalizerDaemon线程执行Finalizer对象的finalize()方法。

       ReferenceQueueDaemon

       FinalizerDaemon守护线程已介绍,这里再看ReferenceQueueDaemon守护线程。创建引用对象时可以关联一个ReferenceQueue队列,被引用对象被GC回收时,该reference对象会被加入其关联队列。加入队列操作由ReferenceQueueDaemon守护线程完成。

       FinalizerWatchdogDaemon

       补充FinalizerWatchdogDaemon守护线程,与FinalizerDaemon和ReferenceQueueDaemon线程一同启动。FinalizerDaemon和ReferenceQueueDaemon线程的runInternal方法中,monitoringNotNeeded方法休眠线程停止timeout计时,此方法唤醒FinalizerWatchdogDaemon守护线程。FinalizerWatchdogDaemon监控两种执行时长:FINALIZER_DAEMON和RQ_DAEMON,执行超时抛出TimeOutException异常,避免在finalize()方法中执行耗时操作。

       OOM排查

       排除大对象和内存泄漏后,在hprof中发现大量X(业务上的某个对象)堆积,X对象对应Java类与Native层有关,重写了finalize()方法,线下无法复现X对象堆积路径。可能的业务场景代码逻辑不当导致X对象疯狂创建,导致FinalizerDaemon线程回收不及时。通过显式调用系统gc和runFinalization方法,发现子线程调用无效,主线程调用导致ANR。查看ANR堆栈发现问题源于某个finalize()方法调用的Native代码卡死,逻辑问题导致死锁,阻塞FinalizerDaemon线程执行,引起对象堆积。

       总结

       Java中finalizer()实现了类似析构函数的概念,可以在对象被回收前执行回收性操作。f类使用不当可能导致问题,避免重载finalizer()方法,通过逻辑接口释放内存,避免频繁创建或大型对象通过finalizer()释放,以防出现相关问题。

       相关守护线程有四个,可深入查看源码。

       线上监控时,可能还需优化UI渲染、奔溃、卡顿、体积包、网络、存储等,整理成脑图。

       内功修炼需持续不断,性能优化同样需要坚持。