专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

阿里一面之LeakCanary内存泄漏监测原理总结

  本文通过在阿里面试遇到的问题总结而出,如有不对地方,请及时批评指正。篇幅较长,请耐心阅读。简介:
  LeakCanary是一个开源的内存泄漏检查工具,使用简单,主要用来监测Activity和Fragment是否发生内存泄漏。如果发生内存泄漏,直接以引用链的形式展示出造成内存泄漏对象。使用步骤添加build。gradle依懒。debugImplementationcom。squareup。leakcanary:leakcanaryandroid:1。6。3releaseImplementationcom。squareup。leakcanary:leakcanaryandroidnoop:1。6。3debugImplementationcom。squareup。leakcanary:leakcanarysupportfragment:1。6。3
  2。在Application中初始化LeakCanary。classCustomApplication:MainApplication(){overridefunonCreate(){super。onCreate()if(!LeakCanary。isInAnalyzerProcess(this)){LeakCanary。install(this);}}}
  完成以上两步操作之后,当打开app运行时,如果Activity或Fragment发生内存泄漏,会以通知的形式提醒用户。源码分析
  先通过流程图来看一下LeakCanary工作原理,如图所示:
  LeakCanary初始化
  1。在application中注册。classCustomApplication:MainApplication(){overridefunonCreate(){super。onCreate()if(!LeakCanary。isInAnalyzerProcess(this)){注册leakcanaryLeakCanary。install(this);}}}
  2。构建观察者RefWatcher。publicstaticRefWatcherinstall(Applicationapplication){构建观察者RefWatcherreturnrefWatcher(application)。listenerServiceClass(DisplayLeakService。class)。excludedRefs(AndroidExcludedRefs。createAppDefaults()。build())。buildAndInstall();}
  3。构建不同的观察者ActivityRefWatcher或FragmentRefWatcher。publicRefWatcherbuildAndInstall(){if(LeakCanaryInternals。installedRefWatcher!null){thrownewUnsupportedOperationException(buildAndInstall()shouldonlybecalledonce。);}RefWatcherrefWatcherbuild();if(refWatcher!DISABLED){观察activityif(watchActivities){ActivityRefWatcher。install(context,refWatcher);}观察fragmentif(watchFragments){FragmentRefWatcher。Helper。install(context,refWatcher);}}LeakCanaryInternals。installedRefWatcherrefWatcher;returnrefWatcher;}
  4。监测activity生命周期。publicstaticvoidinstall(Contextcontext,RefWatcherrefWatcher){Applicationapplication(Application)context。getApplicationContext();ActivityRefWatcheractivityRefWatchernewActivityRefWatcher(application,refWatcher);注册生命周期application。registerActivityLifecycleCallbacks(activityRefWatcher。lifecycleCallbacks);}
  5。将观察对象activity添加到被观察者队列。privatefinalApplication。ActivityLifecycleCallbackslifecycleCallbacksnewActivityLifecycleCallbacksAdapter(){OverridepublicvoidonActivityDestroyed(Activityactivity){在activity的onDestroy生命周期中添加观察对象refWatcher。watch(activity);}};泄漏检测
  1。将被观察对象包装成弱引用。publicvoidwatch(ObjectwatchedReference,StringreferenceName){if(thisDISABLED){return;}判空检查checkNotNull(watchedReference,watchedReference);checkNotNull(referenceName,referenceName);finallongwatchStartNanoTimeSystem。nanoTime();生成唯一keyStringkeyUUID。randomUUID()。toString();保存keyretainedKeys。add(key);包装成弱引用对象finalKeyedWeakReferencereferencenewKeyedWeakReference(watchedReference,key,referenceName,queue);检查被观察对象是否被回收ensureGoneAsync(watchStartNanoTime,reference);}
  2。检测弱引用对象是否被回收。SuppressWarnings(ReferenceEquality)Explicitlycheckingfornamednull。Retryable。ResultensureGone(finalKeyedWeakReferencereference,finallongwatchStartNanoTime){longgcStartNanoTimeSystem。nanoTime();longwatchDurationMsNANOSECONDS。toMillis(gcStartNanoTimewatchStartNanoTime);移除被回收对象的keyremoveWeaklyReachableReferences();if(debuggerControl。isDebuggerAttached()){Thedebuggercancreatefalseleaks。returnRETRY;}判断弱引用是否被回收if(gone(reference)){returnDONE;}触发系统GC进行垃圾回收gcTrigger。runGc();再次移除被回收对象的keyremoveWeaklyReachableReferences();判断弱引用对象是否被回收if(!gone(reference)){将没有被回收对象的内存快照保存成文件longstartDumpHeapSystem。nanoTime();longgcDurationMsNANOSECONDS。toMillis(startDumpHeapgcStartNanoTime);FileheapDumpFileheapDumper。dumpHeap();if(heapDumpFileRETRYLATER){Couldnotdumptheheap。returnRETRY;}longheapDumpDurationMsNANOSECONDS。toMillis(System。nanoTime()startDumpHeap);构建内存快照文件HeapDumpheapDumpheapDumpBuilder。heapDumpFile(heapDumpFile)。referenceKey(reference。key)。referenceName(reference。name)。watchDurationMs(watchDurationMs)。gcDurationMs(gcDurationMs)。heapDumpDurationMs(heapDumpDurationMs)。build();将内存信息回调出去heapdumpListener。analyze(heapDump);}returnDONE;}内存分析
  1。启动HeapAnalyzerService进行内存分析Overridepublicvoidanalyze(HeapDumpheapDump){checkNotNull(heapDump,heapDump);HeapAnalyzerService。runAnalysis(context,heapDump,listenerServiceClass);}
  2。保存文件,并发送通知给用户OverrideprotectedfinalvoidonHeapAnalyzed(HeapDumpheapDump,AnalysisResultresult){StringleakInfoleakInfo(this,heapDump,result,true);CanaryLog。d(s,leakInfo);booleanresultSavedfalse;booleanshouldSaveResultresult。leakFoundresult。failure!null;if(shouldSaveResult){保存内存文件heapDumprenameHeapdump(heapDump);resultSavedsaveResult(heapDump,result);}PendingIntentpendingIntent;StringcontentTitle;StringcontentText;解析内存文件if(!shouldSaveResult){contentTitlegetString(R。string。leakcanarynoleaktitle);contentTextgetString(R。string。leakcanarynoleaktext);pendingIntentnull;}elseif(resultSaved){pendingIntentDisplayLeakActivity。createPendingIntent(this,heapDump。referenceKey);if(result。failurenull){if(result。retainedHeapSizeAnalysisResult。RETAINEDHEAPSKIPPED){StringclassNameclassSimpleName(result。className);if(result。excludedLeak){contentTitlegetString(R。string。leakcanaryleakexcluded,className);}else{contentTitlegetString(R。string。leakcanaryclasshasleaked,className);}}else{StringsizeformatShortFileSize(this,result。retainedHeapSize);StringclassNameclassSimpleName(result。className);if(result。excludedLeak){contentTitlegetString(R。string。leakcanaryleakexcludedretaining,className,size);}else{contentTitlegetString(R。string。leakcanaryclasshasleakedretaining,className,size);}}}else{contentTitlegetString(R。string。leakcanaryanalysisfailed);}contentTextgetString(R。string。leakcanarynotificationmessage);}else{contentTitlegetString(R。string。leakcanarycouldnotsavetitle);contentTextgetString(R。string。leakcanarycouldnotsavetext);pendingIntentnull;}每次发送一个新通知提醒用户。intnotificationId(int)(SystemClock。uptimeMillis()1000);showNotification(this,contentTitle,contentText,pendingIntent,notificationId);afterDefaultHandling(heapDump,result,leakInfo);}
  整个监测过程主要作用如下:
  1。注册监听activity生命周期。
  2。在activity被销毁时加入弱引用队列。
  3。第一次移除不可达对象,移除ReferenceQueue中的KeyedWeakReference。
  4。主动触发GC进行垃圾回收。
  5。第二次移除不可达对象,移除ReferenceQueue中的KeyedWeakReference。
  6。判断当前是否还有对象存活,如果有保存存活对象的内存快照heapDumpFile,然后进行内存分析。
  7。启动HeapAnalyzerService对内存快照进行分析,找出GCroots引用链。
  8。发送通知给用户。
  以上就是阿里面试后总结的几个要点,还不会的同学赶紧学起来吧,感谢您的阅读,创造不易,如果您觉得本篇文章对您有帮助,请点击关注小编,您的支持就是小编创作的最大动力!

国庆湖北武汉荆门周边自驾游去哪里好玩,游吃住行安排得妥妥的国庆长假也将至,旅游又将成为热门话题。国庆的旅游产品,酒店也呈现增长趋势。我曾经跨过山和大海,也穿过人山人海,最后还是遗失在人海里,这恐怕就是国庆期间出行的写照。有车一族更多的会选盘点北京外来人常去,本地人很少去的6个景点,看看你有去过吗?说到北京,大家首先会想到什么呢?我想大家一定会想到北京的繁华,北京的历史,以及北京有名的历史风景区,然而北京有名的旅游地虽多,但是本地人却很少去,下面就带大家盘点本地人常去,外来人全省休闲农业管理人员培训班暨精品景点线路推介在桦甸市举办2022年9月27日,全省休闲农业管理人员培训班暨精品景点线路推介活动在我省休闲农业示范县桦甸市举办。省农业农村厅一级巡视员张永林出席活动并致辞。张永林致辞中指出,近年来,吉林省委山东临沂不可错过的十大旅游景点王羲之故居书圣王羲之居住地,一座古典园林式建筑王羲之故居,位于山东省临沂市兰山区洗砚池街21号,是一座古典园林式建筑,为全国重点文物保护单位山东省重点文物保护单位国家AAA级旅游景鲁台青年数字赋能文创设计成果展暨孔子诞辰2573周年纪念活动在济南举办孔子诞辰2573周年纪念活动(图片来源济南市台港澳办)中国台湾网9月29日讯9月28日,智融两岸共赢未来鲁台青年数字赋能文创设计成果展暨孔子诞辰2573周年纪念活动在济南府学文庙举山东3岁以下婴幼儿父母各享受每年累计不少于10日育儿假视频加载中近日,山东省委省政府印发优化生育政策促进人口长期均衡发展实施方案。方案指出,积极有序实施三孩生育政策。将入户入学入职信用等与个人生育情况全面脱钩。依法依规妥善处理历史遗留山东人游滨州无棣古城游记踏着青石板铺就的甬道,似乎处处弥漫着历史的足音。这个位于城中之城的老城,古色古香有动感,大自然的律动与都市的跃动融为一体,是这座历史名城的一个缩影和真正的历史文化所在。无棣古城历史赏秋地图出炉!来山东这几个地方邂逅绝美秋色四时俱可喜,最好新秋时。暑去秋来之时,最适合走进大自然之间。尽情呼吸新鲜空气,欣赏自然山水与秋色的碰撞之美,感受秋之魅力。山东的秋天,平均气温在10C25C,温度适宜,且秋色秀美,中欧德印等39国去美元化后,日本抛售美债换取人民币,幕后推手出现目前,在美元势头兴起,美元指数持续刷新20年高点之际,根据SWIFT在9月22日发布的最新报告显示,虽然,美元在8月份的全球使用量仍稳居榜首,但全球使用份额已经从2020年时的43新生儿黄疸正常值是多少?正能量董仁高黄疸是由于血清中胆红素升高致使皮肤黏膜和巩膜发黄的症状和体征。正常血清总胆红素为1。717。1molL(0。11mgdl)。胆红素在17。134。2molL(12mgd杨倩晒近照!浓妆气场足,奥运夺金刚1年,大量代言到期头条创作挑战赛距离2022开罗射击世锦赛开始只剩下不足半个月的时间,所有入选开罗射击世锦赛的国家队成员都在进行最后的冲刺性训练。不过作为东京奥运会双金得主,00后小将杨倩却遗憾没能
win系统搜索文件太慢怎么办?这款小工具给你带来极致体验hello大家好,本期内容,机哥给大家分享一款小巧便捷的本地搜索工具,Everything。这款软件可能很多小伙伴没有听说过,说实话机哥也是最近才知道,白白当了互联网人这么多年,惭小橘套新品SymbioAF发布完美适配第二代AirPodsPro作为世界知名的专业耳塞套品牌,来自匈牙利的SymbioEartips,以其标志性的设计和出色的产品体验,在全球各地的用户中拥有良好口碑,尤其是中国地区,小橘套之名早已响彻HIFI圈恭喜全红婵,全红婵再提国家级大奖,新职务曝光,周继红没看错人全红婵在回归国家跳水队集训后就很少传来消息,无论是微博抖音再也没有了更新,全红婵在前段时间回家相聚可以说是彻底放飞了自我,回归了天真无邪,成了村里的孩子王,在回归中国跳水队后全红婵父亲教会我做人冬日生活打卡季父亲走了,走的是那么坦然,那么慈祥,了无牵挂。还是六十年代,父亲不惑之年,我才呀呀学语,蹒珊学步,姐姐长我两岁。听母亲讲,父亲在镇子上建猪场。父亲弟兄六个,一个姐姐,吴王夫差用生命和亡国的代价告诫给世人的道理知人难,知心更难知人难,知心更难!俗话说的好知人知面不知心,何况人心易变时时刻刻都在变化当中。善于用假象来掩盖事实的人,就会使人真假难分,虚实难辨,稍不留神,疏忽大意之间就会铸成大错。要了解你的敌关于华为Mate60Pro消息汇总华为Mate50系列的发布让不少人都为之沸腾,同时,也让不少人对华为重拾了信心,近日外媒还曝光了一组华为Mate60Matero的概念设计图,配备全新的镜框设计和镜头模组,最让人惊iOS微信悄悄更新,拍摄问题终于解决了!头条创作挑战赛近日,发现iOS微信悄悄更新2个功能,终于解决了拍摄对焦模糊问题,和拍摄加入了闪光的功能。iOS微信8。0。31版本中,微信对iPhone13ProiPhone14P从华为Mate30换到Mate50,体验不吐不快,主要3个方面华为Mate50今年终于发布了,我的Mate30终于可以下岗了,本来一直想买Mate40Pro的,但是奈何一机难求,目前也就转转上四千多的二手靠谱一点,不过个人还是想先体验一下新机苹果给出AirTag固件更新2。0。242。0。36更新日志新增精确查找IT之家12月20日消息,自11月以来,苹果已经为其AirTag物品追踪器发布了两个固件更新。然而,该公司此前并没有详细说明这些更新带来了什么变化。不过有网友发现,苹果终于分享了最狗狗币市值超过了Coinbase多年来,狗狗币经历了非凡的旅程。自诞生以来,模因币经历了不同的阶段,才站到了现在的位置。最初的旅程对DOGE来说是艰难的,因为它被批评为只是一个模因代币,仅此而已。然而,埃隆马斯克中小微电商创业呈现新趋势12月9日,工作人员在狮城宁好电商网批(西部)运营基地展销区整理货物。基地位于宁夏吴忠市盐池县,是福建石狮与宁夏盐池跨地域商业合作示范基地,为当地打造电商模式新业态。冯开华摄(新华
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网