chrome安装devtools,iv>GC产生的原因GC类型采集方法释放的数量和占用的空间释放的大对象数量和所占用的空间堆中空闲空间的百分比和(对象的个数)/(堆的总空间)暂停耗时GC 产生的原因GC 产生的原因有如下九种:1)、Concurrent、Alloc、Explicit 跟 Dalvik 的基本一样,这里就不重复介绍了。2)、NativeAlloc:Native 内存分配时,比如为 Bitmaps 或者 RenderScript 分配对象, 这会导致Native内存压力,从而触发GC。3)、Background:后台 GC,触发是为了给后面的内存申请预留更多空间。4)、CollectorTransition:由堆转换引起的回收,这是运行时切换 GC 而引起的。收集器转换包括将所有对象从空闲列表空间复制到碰撞指针空间(反之亦然)。当前,收集器转换仅在以下情况下出现:在内存较小的设备上,App 将进程状态从可察觉的暂停状态变更为可察觉的非暂停状态(反之亦然)。5)、HomogeneousSpaceCompact:齐性空间压缩是指空闲列表到压缩的空闲列表空间,通常发生在当 App 已经移动到可察觉的暂停进程状态。这样做的主要原因是减少了内存使用并对堆内存进行碎片整理。6)、DisableMovingGc:不是真正的触发 GC 原因,发生并发堆压缩时,由于使用了 GetPrimitiveArrayCritical,收集会被阻塞。一般情况下,强烈建议不要使用 GetPrimitiveArrayCritical。7)、HeapTrim:不是触发GC原因,但是请注意,收集会一直被阻塞,直到堆内存整理完毕。GC 类型GC 类型有如下三种:1)、Full:与Dalvik的 FULL GC 差不多。2)、Partial:跟 Dalvik 的局部 GC 差不多,策略时不包含 Zygote Heap。3)、Sticky:另外一种局部中的局部 GC,选择局部的策略是上次垃圾回收后新分配的对象。GC采集的方法GC 采集的方法有如下四种:1)、mark sweep:先记录全部对象,然后从 GC ROOT 开始找出间接和直接的对象并标注。利用之前记录的全部对象和标注的对象对比,其余的对象就应该需要垃圾回收了。2)、concurrent mark sweep:使用 mark sweep 采集器的并发 GC。3)、mark compact:在标记存活对象的时候,所有的存活对象压缩到内存的一端,而另一端可以更加高效地被回收。4)、semispace:在做垃圾扫描的时候,把所有引用的对象从一个空间移到另外一个空间,然后直接 GC 剩余在旧空间中的对象即可。通过 GC 日志,我们可以知道 GC 的量和 它对卡顿的影响,也可以 初步定位一些如主动调用GC、可分配的内存不足、过多使用Weak Reference 等问题。6、Chrome Devtool对于 HTML5 页面而言,抓取 JavaScript 的内存需要使用 Chrome Devtools 来进行远程调试。方式有如下两种:1)、直接把 URL 抓取出来放到 Chrome 里访问。2)、用 Android H5 远程调试。纯H51、手机安装 Chrome,打开 USB 调试模式,通过 USB 连上电脑,在 Chrome 里打开一个页面,比如百度页面。然后在 PC Chrome 地址栏里访问 Chrome://inspect,如下图所示:image2、最后,直接点击 Chrome 下面的 inspect 选项即可弹出开发者工具界面。如下图所示:image默认 Hybrid H5 调试Android 4.4 及以上系统的原生浏览器就是 Chrome 浏览器,可以使用 Chrome Devtool 远程调试 WebView,前提是需要在 App 的代码里把调试开关打开,如下代码所示:if (Build.VERSION_SDK_INT >= Build.VERSION

iv>

GC产生的原因

GC类型

采集方法

释放的数量和占用的空间

释放的大对象数量和所占用的空间

堆中空闲空间的百分比和(对象的个数)/(堆的总空间)

暂停耗时

GC 产生的原因

GC 产生的原因有如下九种:

1)、Concurrent、Alloc、Explicit 跟 Dalvik 的基本一样,这里就不重复介绍了。2)、NativeAlloc:Native 内存分配时,比如为 Bitmaps 或者 RenderScript 分配对象, 这会导致Native内存压力,从而触发GC。3)、Background:后台 GC,触发是为了给后面的内存申请预留更多空间。4)、CollectorTransition:由堆转换引起的回收,这是运行时切换 GC 而引起的。收集器转换包括将所有对象从空闲列表空间复制到碰撞指针空间(反之亦然)。当前,收集器转换仅在以下情况下出现:在内存较小的设备上,App 将进程状态从可察觉的暂停状态变更为可察觉的非暂停状态(反之亦然)。5)、HomogeneousSpaceCompact:齐性空间压缩是指空闲列表到压缩的空闲列表空间,通常发生在当 App 已经移动到可察觉的暂停进程状态。这样做的主要原因是减少了内存使用并对堆内存进行碎片整理。6)、DisableMovingGc:不是真正的触发 GC 原因,发生并发堆压缩时,由于使用了 GetPrimitiveArrayCritical,收集会被阻塞。一般情况下,强烈建议不要使用 GetPrimitiveArrayCritical。7)、HeapTrim:不是触发GC原因,但是请注意,收集会一直被阻塞,直到堆内存整理完毕。GC 类型

GC 类型有如下三种:

1)、Full:与Dalvik的 FULL GC 差不多。2)、Partial:跟 Dalvik 的局部 GC 差不多,策略时不包含 Zygote Heap。3)、Sticky:另外一种局部中的局部 GC,选择局部的策略是上次垃圾回收后新分配的对象。GC采集的方法

GC 采集的方法有如下四种:

1)、mark sweep:先记录全部对象,然后从 GC ROOT 开始找出间接和直接的对象并标注。利用之前记录的全部对象和标注的对象对比,其余的对象就应该需要垃圾回收了。2)、concurrent mark sweep:使用 mark sweep 采集器的并发 GC。3)、mark compact:在标记存活对象的时候,所有的存活对象压缩到内存的一端,而另一端可以更加高效地被回收。4)、semispace:在做垃圾扫描的时候,把所有引用的对象从一个空间移到另外一个空间,然后直接 GC 剩余在旧空间中的对象即可。

通过 GC 日志,我们可以知道 GC 的量和 它对卡顿的影响,也可以 初步定位一些如主动调用GC、可分配的内存不足、过多使用Weak Reference 等问题。

6、Chrome Devtool

对于 HTML5 页面而言,抓取 JavaScript 的内存需要使用 Chrome Devtools 来进行远程调试。方式有如下两种:

1)、直接把 URL 抓取出来放到 Chrome 里访问。2)、用 Android H5 远程调试。纯H51、手机安装 Chrome,打开 USB 调试模式,通过 USB 连上电脑,在 Chrome 里打开一个页面,比如百度页面。然后在 PC Chrome 地址栏里访问 Chrome://inspect,如下图所示:image2、最后,直接点击 Chrome 下面的 inspect 选项即可弹出开发者工具界面。如下图所示:image默认 Hybrid H5 调试

Android 4.4 及以上系统的原生浏览器就是 Chrome 浏览器,可以使用 Chrome Devtool 远程调试 WebView,前提是需要在 App 的代码里把调试开关打开,如下代码所示:

if (Build.VERSION_SDK_INT >= Build.VERSION_CODES.KITKAT && 是debug模式) {WebView.setWebContentsDebuggingEnabled(ture);}

打开后的调试方法跟纯 H5 页面调试方法一样,直接在 App 中打开 H5 页面,再到 PC Chrome 的 inpsector 页面就可以看到调试目标页面。

这里总结一下 JS 中几种常见的内存问题点:

1)、closure 闭包函数。2)、事件监听。3)、变量作用域使用不当,全局变量的引用导致无法释放。4)、DOM 节点的泄漏。

若想更深入地学习 Chrome 开发者工具的使用方法,请查看 《Chrome开发者工具中文手册》。

八、内存问题总结

========

在我们进行内存优化的过程中,有许多内存问题都可以归结为一类问题,为了便于以后快速地解决类似的内存问题,我将它们归结成了以下的多个要点:

1、内类是有危险的编码方式

说道内类就不得不提到 ”**this0“∗∗,它是一种奇特的内类成员,每个类实例都具有一个this0“**,它是一种奇特的内类成员,每个类实例都具有一个 this0“∗∗,它是一种奇特的内类成员,每个类实例都具有一个this0,当它的内类需要访问它的成员时,内类就会持有外类的 this0,通过this0,通过 this0,通过this0 就可以访问外部类所有的成员。

解决方案是在 Activity 关闭,即触发 onDestory 时解除内类和外部的引用关系。

2、普通 Hanlder 内部类的问题

这也是一个 this$0 间接引用的问题,对于 Handler 的解决方案一般可以归结为如下三个步骤:

1)、把内类声明成 static:用来断绝 this$0 的引用。因为 static 描述的内类从 Java 编译原理的角度看,”内类“与”外类“相互独立,互相都没有访问对方成员变量的能力。2、使用 WeakReference 来引用外部类的实例。3、在外部类(如 Activity)销毁的时候使用 removeCallbackAndMessages 来移除回调和消息。

这里需要在使用过程中注意对 WeakReference 进行判空。

3、登录界面的内存问题

如果在闪屏页跳转到登录界面时没有调用 finish(),则会造成闪屏页的内存泄漏,在碰到这种”过渡界面“的情况时,需要注意不要产生这样的内存 Bug。

4、使用系统服务时产生的内存问题

我们通常都会使用 getSystemService 方法来获取系统服务,但是当在 Activity 中调用时,会默认把 Activity 的 Context 传给系统服务,在某些不确定的情况下,某些系统服务内部会产生异常,从而 hold 住外界传入的 Context。

解决方案是 直接使用 Applicaiton 的 Context 去获取系统服务。

5、把 WebView 类型的泄漏装进垃圾桶进程

我们都知道,对应 WebView 来说,其 网络延时、引擎 Session 管理、Cookies 管理、引擎内核线程、HTML5 调用系统声音、视频播放组件等产生的引用链条无法及时打断,造成的内存问题基本上可以用”无解“来形容。

解决方案是我们可以 把 WebView 装入另一个进程。 具体为在 AndroidManifes 中对当前的 Activity 设置 android:process 属性即可,最后,在 Activity 的 onDestory 中退出进程,这样即可基本上终结 WebView 造成的泄漏。

6、在适当的时候对组件进行注销

我们在平常开发过程中经常需要在Activity创建的时候去注册一些组件,如广播、定时器、事件总线等等。这个时候我们应该在适当的时候对组件进行注销,如 onPause 或 onDestory 方法中。

7、Handler / FrameLayout 的 postDelyed 方法触发的内存问题

不仅在使用 Handler 的 sendMessage 方法时,我们需要在 onDestory 中使用 removeCallbackAndMessage 移除回调和消息,在使用到 Handler / FrameLayout 的 postDelyed 方法时,我们需要调用 removeCallbacks 去移除实现控件内部的延时器对 Runnable 内类的持有。

8、图片放错资源目录也会有内存问题

在做资源适配的时候,因为需要考虑到 APK 的瘦身问题,无法为每张图片在每个 drawable / mipmap 目录下安置一张适配图片的副本。很多同学不知道图片应该放哪个目录,如果放到分辨率低的目录如 hdpi 目录,则可能会造成内存问题,这个时候建议尽量问设计人员要高品质图片然后往高密度目录下方,如 xxhdpi 目录,这样 在低密屏上”放大倍数“是小于1的,在保证画质的前提下,内存也是可控的。也可以使用 Drawable.createFromSream 替换 getResources().getDrawable 来加载,这样便可以绕过 Android 的默认适配规则。

对于已经被用户使用物理“返回键”退回到后台的进程,如果包含了以下 两点,则 不会被轻易杀死。

1)、进程包含了服务 startService,而服务本身调用了 startForeground(低版本需通过反射调用)。2)、主 Activity 没有实现 onSaveInstanceState 接口。

但建议 在运行一段时间(如3小时)后主动保存界面进程(位于后台),然后重启它,这样可以有效地降低内存负载。

9、列表 item 被回收时注意释放图片的引用

我们应该在 item 被回收不可见时去释放掉对图片的引用。如果你使用的是 ListView,由于每次 item 被回收后被再次利用都会去重新绑定数据,所以只需在 ImageView 回调其 onDetchFromWindow 方法的时候区释放掉图片的引用即可。如果你使用的是 RecyclerView,因为被回收不可见时第一次选择是放进 mCacheView中,但是这里面的 item 被复用时并不会去执行 bindViewHolder 来重新绑定数据,只有被回收进 mRecyclePool 后拿出来复用才会重新绑定数据。所以此时我们应该在 item 被回收进 RecyclePool 的时候去释放图片的引用,这里我们只要去 重写 Adapter 中的 onViewRecycled 方法 就可以了,代码如下所示:

@Overridepublic void onViewRecycled(@Nullable VH holder) {super.onViewRecycled(holder);if (holder != null) {//做释放图片引用的操作}}

10、使用 ViewStub 进行占位

我们应该使用 ViewStub 对那些没有马上用到的资源去做延迟加载,并且还有很多大概率不会出现的 View 更要去做懒加载,这样可以等到要使用时再去为它们分配相应的内存。

11、注意定时清理 App 过时的埋点数据

产品或者运营为了统计数据会在每个版本中不断地增加新的埋点。所以我们需要定期地去清理一些过时的埋点,以此来 适当地优化内存以及CPU的压力。

12、针对匿名内部类 Runnable 造成内存泄漏的处理

我们在做子线程操作的时候,喜欢使用匿名内部类 Runnable 来操作。但是,如果某个 Activity 放在线程池中的任务不能及时执行完毕,在 Activity 销毁时很容易导致内存泄漏。因为这个匿名内部类 Runnable 类持有一个指向 Outer 类的引用,这样一来如果 Activity 里面的 Runnable 不能及时执行,就会使它外围的 Activity 无法释放,产生内存泄漏。从上面的分析可知,只要在 Activity 退出时没有这个引用即可,那我们就通过反射,在 Runnable 进入线程池前先干掉它,代码如下所示:

Field f = job.getClass().getDeclaredField(""this$0"");f.setAccessible(true);f.set(job夜风•2022年8月13日 pm10:51•IT教程•阅读 11

null);

这个任务就是我们的 Runnable 对象,而 ”this$0“ 就是上面所指的外部类的引用了。这里注意使用 WeakReference 装起来,要执行了先 get 一下,如果是 null 则说明 Activity 已经回收,任务就放弃执行。

九、内存优化常见问题

==========

1、你们内存优化项目的过程是怎么做的?

1、分析现状、确认问题

我们发现我们的 APP 在内存方面可能存在很大的问题,第一方面的原因是我们的线上的 OOM 率比较高。

第二点呢,我们经常会看到在我们的 Android Studio 的 Profiler 工具中内存的抖动比较频繁。

这是我们一个初步的现状,然后在我们知道了这个初步的现状之后,进行了问题的确认,我们经过一系列的调研以及深入研究,我们最终发现我们的项目中存在以下几点大问题,比如说:内存抖动、内存溢出、内存泄漏,还有我们的Bitmap 使用非常粗犷。

2、针对性优化

比如 内存抖动的解决 => Memory Profiler 工具的使用(呈现了锯齿张图形) => 分析到具体代码存在的问题(频繁被调用的方法中出现了日志字符串的拼接),也可以说说 内存泄漏或内存溢出的解决。

3、效率提升

为了不增加业务同学的工作量,我们使用了一些工具类或 ARTHook 这样的 大图检测方案,没有任何的侵入性。同时,我们将这些技术教给了大家,然后让大家一起进行 工作效率上的提升。

我们对内存优化工具Profiler Memory、MAT 的使用比较熟悉,因此 针对一系列不同问题的情况,我们写了 一系列解决方案的文档,分享给大家。这样,我们 整个团队成员的内存优化意识就变强 了。

2、你做了内存优化最大的感受是什么?

1、磨刀不误砍柴工

我们一开始并没有直接去分析项目中代码哪些地方存在内存问题,而是先去学习了 Google 官方的一些文档,比如说学习了 Memory Profiler 工具的使用、学习了 MAT 工具的使用,在我们将这些工具学习熟练之后,当在我们的项目中遇到内存问题时,我们就能够很快地进行排查定位问题进行解决。

2、技术优化必须结合业务代码

一开始,我们做了整体 APP 运行阶段的一个内存上报,然后,我们在一些重点的内存消耗模块进行了一些监控,但是,后面发现这些监控并没有紧密地结合我们的业务代码,比如说在梳理完项目之后,发现我们项目中存在使用多个图片库的情况,多个图片库的内存缓存肯定是不公用的,所以 导致我们整个项目的内存使用量非常高。所以进行技术优化时必须结合我们的业务代码。

3、系统化完善解决方案

我们在做内存优化的过程中,不仅做了 Android 端的优化工作,还将我们 Android 端一些数据的采集上报到了我们的服务器,然后传到我们的 APM 后台,这样,方便我们的无论是 Bug 跟踪人员或者是 Crash 跟踪人员进行一系列问题的解决。

3、如何检测所有不合理的地方?

比如说 大图片的检测,我们最初的一个方案是通过继承 ImageView,重写 它的 onDraw 方法来实现。但是,我们在推广它的过程中,发现很多开发人员并不接受,因为很多 ImageView 之前已经写过了,你现在让他去替换,工作成本是比较高的。所以说,后来我们就想,有没有一种方案可以 免替换,最终我们就找到了 ARTHook 这样一个 Hook 的方案。

十、总结

====

对于 内存优化的专项优化 而言,我们要着重注意两点,即 优化大方向 和 优化细节。

1、优化大方向

对于 优化的大方向,我们应该 优先去做见效快的地方,主要有以下三部分:

1)、内存泄漏2)、内存抖动3)、Bitmap

2、优化细节

对于 优化细节,我们应该 注意一些系统属性或内存回调的使用 等等,主要可以细分为如下六部分:

1)、LargeHeap 属性2)、onTrimMemory / onLowMemory3)、使用优化过后的集合:如 SparseArray 类簇4)、谨慎使用 SharedPreference5)、谨慎使用外部库6)、业务架构设计合理

3、内存优化体系化建设总结

在这篇文章中,我们除了建立了 内存的监控闭环 这一核心体系之外,还实现了以下 十大组件 / 策略:

1)、根据设备分级来使用不同的内存和分配回收策略。2)、针对低端机做了功能或图片加载格式的降级处理。3)、针对缓存滥用的问题实现了统一的缓存管理组件。4)、实现了大图监控和重复图片的监控。5)、在前台每隔一定时间去获取当前应用内存占最大内存的比例,当超过设定阈值时则主动释放应用 cache。6)、当 UI 隐藏时释放内存以增加系统缓存应用进程的能力。7)、高效实现了应用全局内的 Bitmap 监控。8)、实现了全局的线程监控。9)、针对内存使用的重度场景实现了 GC 监控。10)、实现了线下的 native 内存泄漏监控。

最后,当监控到 应用内存超过阈值时,还定制了 完善的兜底策略 来 重启应用进程。

总的来看,要建立一套 全面且成体系的内存优化及监控 是非常重要也是极具挑战性的一项工作。并且,目前各大公司的 内存优化体系 也正处于 不断演进的历程 之中,其目的不外乎:实现更健全的功能、更深层次的定位问题、快速准确地发现线上问题。

路漫漫其修远兮,吾将上下而求索

参考链接:

1、国内Top团队大牛带你玩转Android性能分析与优化 第四章 内存优化

2、极客时间之Android开发高手课 内存优化

3、微信 Android 终端内存优化实践

4、GMTC-Android内存泄漏自动化链路分析组件Probe.key

5、Manage your app's memory

6、Overview of memory management

7、Android内存优化杂谈

8、Android性能优化之内存篇

9、管理应用的内存

10、《Android移动性能实战》第二章 内存

11、每天一个linux命令(44):top命令

12、Android内存分析命令

很感谢您阅读这篇文章,希望您能将它分享给您的朋友或技术群,这对我意义重大。

本文转自 https://juejin.cn/post/6872919545728729095,如有侵权,请联系删除。

相关视频推荐:

【2021最新版】Android studio安装教程+Android(安卓)零基础教程视频(适合Android 0基础,Android初学入门)含音视频_哔哩哔哩_bilibili

Android进阶系统学习——Jetpack先天优秀的基因可以避免数据内存泄漏_哔哩哔哩_bilibili

"

原创文章,作者:夜风,如若转载,请注明出处:https://www.homedt.net/278967.html

Vue-devtools、React Developer Tools安装_和你一起去月球 ...Vue调试工具vue-devtools怎么安装与使用 - 开发技术 - 亿速云安装Vue Devtools调试工具插件Vue.js Devtools插件下载_Chrome开发者工具插件官方新版 ...追“妹纸”,就靠它了-小白学堂博客评论 - 通过npm安装vue-devtools(vue的chrome调试工 …Chrome这个缺点实在忍不了?这一款小工具推荐给你 ...google-chrome-extension - 如何在这部分代码调试 chrome ...浏览器实用教程_浏览器使用方法_浏览器操作指南-chrome之家chrome浏览器的devtools详解Chrome浏览器安装Vue.js devtools插件通过实例解析chrome如何在mac环境中安装vue-devtools插件2021 Chrome Devtools 新特性浅谈前端开发调试工具Chrome DevTools的使用chrome devtools 开发之消息通信【转】chrome devtools protocol——Web 性能自动化Redux DevTools工具的安装Chrome devTools笔记vue-devtools安装与使用Chrome DevTools的10个开发设计实用小技巧chrome安装vue-devtools安装使用react devtools的两种方式Chrome 调试工具【DevTools】详解Chrome DevTools中的这些骚操作,你都知道吗?Vue Devtools | 谷歌(Chrome)浏览器插件Chrome Devtools Styler-crx插件windows下chrome安装vue-devtools扩展程序(亲测)Chrome DevTools移动端调试chrome插件Vue devtools6.2.1离线安装包python selenium chrome 控制devtools 一些线索rawkit:debugging调试Node.js应用程序时立即打开Chrome DevToolschrome-response-override:Chrome devtools扩展程序可即时修改响应,无需安装外部应用Chrome 浏览器安装Vue Devtools调试工具ChromeChrome-devtools:对ios-safari移动端的H5页面进行调试(ios-webkit-debug-proxy)devtools-docs:Chrome DevTools 的旧文档安装React DevTools for Chrome保姆式教学安装与配置Chrome的Vue调试工具vue-devtoolsChrome DevTools之命令(Command)菜单和动画检查
chrome devtools 下载vue devtools chrome下载vue devtools的安装vue devtools chrome downloadchrome 安装 vue devtoolsreact devtools chrome下载devtools安装教程安装 devtoolschrome安装vue devtoolschrome安装到其他盘chrome安装失败chrome安装包apkchrome安装目录chrome安装不了chrome安装包Chrome安装程序无法解压缩存档文件chrome安装了找不到chrome安装插件南宁市医院招聘护士最新招聘三点共圆怎么证明网络文学写手自驾香格里拉旅游攻略景点大全牛奶鸡蛋算生酮食物吗万古神帝有声小说全集免费直播吧里面的视频手机怎么下载手机号码大号与小号有什么区别新鲜土到烘干土水分换算系数一斤猪皮放几斤水煮皮冻艾基特林海蛇