Android内存泄漏分析及检测工具LeakCanary简介,Android进阶

这篇具有很好参考价值的文章主要介绍了Android内存泄漏分析及检测工具LeakCanary简介,Android进阶。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

@Synchronized override fun expectWeaklyReachable(

watchedObject: Any,

description: String

) {

if (!isEnabled()) {

return

}

removeWeaklyReachableObjects()

val key = UUID.randomUUID()

.toString()

val watchUptimeMillis = clock.uptimeMillis()

val reference =

KeyedWeakReference(watchedObject, key, description, watchUptimeMillis, queue)

SharkLog.d {

"Watching " +

(if (watchedObject is Class<*>) watchedObject.toString() else “instance of ${watchedObject.javaClass.name}”) +

(if (description.isNotEmpty()) " ($description)" else “”) +

" with key $key"

}

watchedObjects[key] = reference

checkRetainedExecutor.execute {

moveToRetained(key)

}

}

上述代码的主要逻辑是:

  1. 移除弱可达的对象

  2. 将当前的watchedObject添加到KeyedWeakReference当中

  3. 将这个weakReference保存到数组中

  4. checkRetainedExecutor中执行moveToRetained方法

根据removeWeaklyReachableObjects方法中原理,如果这个对象除了由ObjectWatcher所添加的WeakReference以外,没有其他对象在引用它了,那么这个对象也就可以回收了,watchedObjects也就可以移除他了。

private fun removeWeaklyReachableObjects() {

var ref: KeyedWeakReference?

do {

ref = queue.poll() as KeyedWeakReference?

if (ref != null) {

watchedObjects.remove(ref.key)

}

} while (ref != null)

}

}

checkRetainedExecutor其实是个单例对象,里面会通过handler来延迟5s来执行方法。如果超过5s则会触发LeakCanary的泄漏检测机制。5s只是个经验值应该,因为GC并不是实时发生,因而预留5s交给GC操作。

触发了LeakCanary的泄漏检测之后,则会执行HeapDumpTriggerdumpHeap方法,在获取到了.hprof文件之后,调用HeapAnalyzerService.runAnalysis()给出分析结果。 关于.hprof文件的分析,不是本文重点,具体可以参考hprof文件协议。其分析基本也就是根据GC Root去寻找泄漏的对象,大体流程图如下。

android leakcanary,2024年程序员学习,android

在Android中常见的内存泄漏

单例

单例所导致的内存泄漏几乎是在android开发中最为常见的内存泄漏问题了。

public class Singleton {

private static Singleton singleton;

private Context context;

private Singleton(Context context) {

this.context = context;

}

public static Singleton getInstance(Context context) {

if (singleton == null) {

singleton = new Singleton(context);

}

return singleton;

}

}

在上面的代码中,如果在执行getInstance方法的时候,传入的是activity的对象,那么该activity对象就没法被及时回收,导致内存泄漏,可以考虑传入ApplicationContext,或者把context放入到方法变量中。

非静态内部类(包括匿名内部类)

非静态内部类会默认持有外部类的引用,如果它的生命周期长于外部类时,就会导致内存泄漏。 在android开发,这种情况常常见于Handler的使用。

尽可能避免使用静态变量

class MainActivity : AppCompatActivity() {

companion object {

@JvmStatic

private var info: StaticInfo? = null

}

override fun onCreate(savedInstanceState: Bundle?) {

info = StaticInfo(this)

}

class StaticInfo(activity: MainActivity) {

}

在上述代码中,info是一个静态变量,但是它持有了activity的引用,由于静态变量的生命周期要比activity的生命周期长,导致activity无法及时回收,造成内存泄漏。

资源未关闭造成的内存泄漏

诸如cursor、inputStream等对象一定要注意及时关闭

try {

}catch (e:Exception) {

}finally {

// 可以在finally方法里把cursor等对象进行关闭

}

集合中的对象未及时清理造成的内存泄漏

val list = ArrayList()

例如,如果一个list中存放的是activity对象,就会可能导致activity无法及时回收。如果该list是静态对象的话,不及时移除activity的话,就更会产生内存泄漏了。

webview造成的内存泄漏

因为webview在加载完网页后,它的callback会持有activity的引用,造成webview的内存无法释放。可以在activity的onDestroy()方法中移除该webview,并调用webview.destroy()。

未取消注册或回调造成的内存泄漏

在android中回调是使用非常多的,但如果在注册回调的时候,传入了context对象,则需要注 意及时取消回调,否则就可能会出现内存泄漏。例如eventbus和广播。

内存优化

  • 使用intentService代替Service,或者service执行完记得及时停止

  • 在系统资源紧张的时候,尽可能多释放一些非重要的资源(如图片的内存缓存)

class MyApp : Application() {

override fun onTrimMemory(level: Int) {

super.onTrimMemory(level)

// 可以在这里做些内存释放的工作

}

}

  • 避免bitmap的滥用

如果不是必须操作bitmap,对于图片加载,我们可以使用一些优秀的第三方库来进行加载。使用bitmap记得复用和及时回收。

  • 使用针对内存优化过的数据容器

在大多数场景下,可以使用SparseArray代替HashMap等可以一定程度上减少内存使用。

  • 使用多进程

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
android leakcanary,2024年程序员学习,android
android leakcanary,2024年程序员学习,android
android leakcanary,2024年程序员学习,android
android leakcanary,2024年程序员学习,android

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
android leakcanary,2024年程序员学习,android

总结

首先是感觉自己的基础还是不够吧,大厂好像都喜欢问这些底层原理。

另外一部分原因在于资料也还没有看完,一面时凭借那份资料考前突击恶补个几天居然也能轻松应对(在这里还是要感谢那份资料,真的牛),于是自我感觉良好,资料就没有怎么深究下去了。

之前的准备只涉及了Java、Android、计网、数据结构与算法这些方面,面对面试官对其他基础课程的考察显得捉襟见肘。

下一步还是要查漏补缺,进行针对性复习。

最后的最后,那套资料这次一定要全部看完,是真的太全面了,各个知识点都涵盖了,几乎我面试遇到的所有问题的知识点这里面都有!在这里也免费分享给大家,希望大家不要犯和我一样的错误呀!!!一定要看完!
android leakcanary,2024年程序员学习,android

android leakcanary,2024年程序员学习,android

android leakcanary,2024年程序员学习,android
获取方式:点击我的GitHub

d、计网、数据结构与算法这些方面,面对面试官对其他基础课程的考察显得捉襟见肘。

下一步还是要查漏补缺,进行针对性复习。

最后的最后,那套资料这次一定要全部看完,是真的太全面了,各个知识点都涵盖了,几乎我面试遇到的所有问题的知识点这里面都有!在这里也免费分享给大家,希望大家不要犯和我一样的错误呀!!!一定要看完!
[外链图片转存中…(img-xIPHanw0-1711046455617)]

[外链图片转存中…(img-r5jSmCJT-1711046455617)]

[外链图片转存中…(img-58xIsvt7-1711046455618)]
获取方式:点击我的GitHub文章来源地址https://www.toymoban.com/news/detail-857767.html

到了这里,关于Android内存泄漏分析及检测工具LeakCanary简介,Android进阶的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • android 如何进行内存泄漏检测及解决方法

    内存泄漏是在Android开发中常见的问题之一,它可能导致应用的内存占用逐渐增加,最终影响应用的性能和稳定性。以下是一些常见的方法来进行内存泄漏检测和解决: 1. 使用工具进行内存泄漏检测: Android Profiler: Android Studio提供的Android Profiler工具可以帮助您监视应用的内

    2024年02月07日
    浏览(37)
  • 【Android】一个contentResolver引起的内存泄漏问题分析

    长时间的压力测试后,系统发生了重启,报错log如下 JNI ERROR (app bug): global reference table overflow (max=51200) global reference table overflow的log 08-08 04:11:53.052912   973  3243 F zygote64: indirect_reference_table.cc:256] JNI ERROR (app bug): global reference table overflow (max=51200) 08-08 04:11:53.053014   973  3243 F z

    2024年02月08日
    浏览(30)
  • jvm内存溢出排查(使用idea自带的内存泄漏分析工具)

    想分析堆内存溢出,一定在运行jar包时就写上参数 -XX:+HeapDumpOnOutOfMemoryError ,可以看我之前关于如何运行jar包的文章。若你没有写。可以写上参数,重启你的项目,等你的项目发生下一次堆内存溢出异常,在运行的同级文件夹,将产生类似这样一个文件 java_pid74935.hprof ,若你

    2024年02月09日
    浏览(41)
  • 内存泄漏检测方式

    一 、 日志记录         通过宏定义重载了 malloc 和 free 函数,以在分配和释放内存的时候记录一些信息,包括文件名和行号,并将这些信息写入到相应的文件中。然后在 main 函数中演示了使用这些宏进行内存分配和释放。 _malloc 函数: 在分配内存之后,创建一个文件名,

    2024年01月17日
    浏览(29)
  • 项目性能优化-内存泄漏检测与修改

    最近终于有空优化一波项目的性能了,第一波借助Android Studio自带的Profiler工具检测内存泄漏。 右侧带有绿色原点的就是此时运行的Profiler的SESSION,点击右侧MEMORY进入内存监控的详情模块 第三步中抓取一段时间后,会自动停止,并打开Heap Dump文件 可以看到抓取到2个会导致内存

    2024年02月11日
    浏览(39)
  • iOS 内存泄漏检测 Instruments Leaks

    Xcode 中 按住 command + I 或者菜单栏 Product – Profile 2. 双击 Leaks 或者按 choose,打开 Leaks 面板 3. 在显示的 Leaks 面板中,点击左上角红色点,即可运行内存检测。 4. 在运行过程中如果发现Leak Checks(如图)出现红色X说明检测到内存泄露,将鼠标点击Leak Checks,在下方即可看到内存

    2024年02月01日
    浏览(31)
  • Python中的内存泄漏及其检测方法

    一、引言 内存泄漏是编程中常见的问题之一,它会导致程序在运行过程中不断消耗内存,最终可能导致程序崩溃或性能下降。在Python中,内存泄漏也是一个需要关注的问题。本文将详细介绍Python中的内存泄漏及其检测方法,以帮助读者更好地理解和解决这个问题。 二、Pyth

    2024年02月22日
    浏览(38)
  • 手写C语言的内存泄漏检测组件

    CC++语言中,栈空间有大小限制,所以程序员可以使用堆空间的内存。堆空间的内存是程序员自己申请的,需要程序员自己去调用释放的操作。内存管理是CC++程序员必须要注意的问题,其中包括了内存泄漏,内存泄漏的原因是程序中申请的内存没有进行释放,来看下面的例子

    2024年02月03日
    浏览(26)
  • Android之内存泄漏与内存溢出

    内存泄漏(memory leak):是指程序在申请内存后,无法释放已申请的内存空间,导致系统无法及时回收内存并且分配给其他进程使用。通常少次数的内存无法及时回收并不会到程序造成什么影响,但是如果在内存本身就比较少获取多次导致内存无法正常回收时,就会导致内存

    2024年02月13日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包