首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

全新 LeakCanary 2 ! 完全基于 Kotlin 重构升级 !

本文中,就让我们通过源码来看看 2.0 版本发生了哪些变化。本文不会过多分析源码细节,详细细节可以阅读之前基于 1.5.4 版本写文章,两个版本原理方面并没有太大变化。...发现内存泄露之后进行 heap dump ,利用 Square 公司另一个库 haha(已废弃)来分析 heap dump 文件,找到引用链之后通知用户。这一套原理新版本中还是没变。...你肯定会有一个疑问,那它是如何初始化呢?刚看到这个使用文档时候,同样也有这个疑问。当你看看源码之后就一目了然了。...首先会调用 removeWeaklyReachableReferences() 方法这个方法整个过程中会多次调用。...GC 之后再次调用 checkRetainedCount() 判断泄露实例个数。如果此时仍然满足条件,就要发起 heap dump 操作了。

50910

LeakCanary 学习与实践

例如,调用Activity.onDestroy()之后,Activity 其视图层次结构及其关联位图应该都是可进行垃圾回收。如果在后台运行线程持有对活动引用,则无法回收相应内存。...如果一个库可以在你进入OOM之前完成所有这些,并让你专注于修复内存泄漏怎么办? 这样岂不是让我们很爽么? So,我们 LeakCanary 应用而生了~ 2. Enmmm,怎么用它呢?...最简单选择是调用 LeakCanary.install(this); ,它会安装一个 ActivityRefWatcher,从而自动检测 Activity Activity.onDestroy()...可以创建自己 ExcludedRefs 版本,以忽略知道导致泄漏特定引用,但我们仍然要进行如下设置: public class DebugExampleApplication extends ExampleApplication...以下是堆转储中找到泄漏实例方法: 寻找所有的实例 com.squareup.leakcanary.KeyedWeakReference; 对于其中每一个,请查看该 key 字段; 找到 KeyedWeakReference

1.3K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Java内存泄漏检测库LeakCanary介绍,了解?

    这个位图是设备屏幕大小,我们创建它时发生了大量内存不足(OOM)崩溃。 ? Java内存泄漏检测库LeakCanary介绍,了解?...当内存几乎满时候,OOM可以发生在任何地方。创建大对象(如位图)地方,这种情况更容易发生。OOM是一个更深层次问题征兆: **内存泄漏 **。 什么是内存泄漏? 某些对象寿命有限。...例如,调用 Activity.onDestroy() 时,其视图层次结构及其关联位图都应该是可垃圾回收。如果在后台运行线程持有对活动引用,则无法回收相应内存。...Cat schrodingerCat = new Cat(); box.hiddenCat = schrodingerCat; Docker.container = box; 创建 RefWatcher 实例并为其指定要监视对象...void onCreate() { super.onCreate(); LeakCanary.install(this); } } 你会得到一个通知和一个很好开箱即用显示: ?

    98420

    Matrix ResourceCanary -- Activity 泄漏及Bitmap冗余检测

    最直观想法就是找一个Activity被销毁时必经调用点记录下当前Activity信息,显然 Activity.onDestroy() 方法是一个不错选择。...通过某种机制得知 Activity.onDestroy() 方法被调用,然后进行记录 Android 4.0以前可以通过反射替换ActivityThread.mInstrumentation对象为自己代理...我们可以通过创建一个持有已销毁 Activity WeakReference ,然后主动触发一次 GC ,如果这个 Activity 能被回收,则持有它 WeakReference 会被置空,且这个被回收...他们包括下列对象: 类;(被JVM加载类是无法卸载,因此无法被回收,导致被类持有(即通过静态成员持有)对象也无法被回收) 活动 Thread 实例; 局部变量或方法参数变量持有的对象; JNILocalReference...数组,其余 buffer 数据都可以直接剔除,这样处理之后 Hprof 文件通常能比原始文件小 1/10 以上。

    3.5K61

    Handler都没搞懂,拿什么去跳槽啊?!

    Handler 重写 handleMessage 方法 ,然后需要时候调用它 send 以及 post 系列方法可以了,非常简单易用,并且支持延时消息。...2.1 Handler 与 Looper 关联 实际上我们实例化 Handler 时候 Handler 会去检查当前线程 Looper 是否存在,如果不存在则会报异常,也就是说创建 Handler...平时我们用时候从异步线程发送消息到 Handler,这个 Handler handleMessage() 方法主线程调用,所以消息就从异步线程切换到了主线程。...这些我会讲解一些,没讲到可以自行搜索相关内容进行了解。...这个就很有意思了,这有什么作用呢? 我们可以利用 Callback 这个拦截机制来拦截 Handler 消息!

    70610

    万万没想到,Redis多线程版本竟然比原生版本快那么多

    如果告诉您有一个 Redis 分支版本,它性能比原生 Redis 快 5 倍,而且延迟却降低近 5 倍,你会不会想了解一下这个项目?...这个分支版本,它其实是 Redis 一个分叉版本,名叫 KeyDB 。KeyDB 是 Redis 开源多线程分叉版本。...关于为什么首先搞一个 Redis 分叉原因,这是因为 KeyDB 和 Redis 如何发展方面有不同理念。我们认为易用性、高性能和“内置动力”方法是创造良好用户体验最佳方法。...以下是基准测试(操作/秒)与使用线程数对应关系图表: ? 随着分配更多资源给实例,您可以看到性能得到大幅提高。...同时还可以可以将线程固定到某个CPU上以得到进一步提升,但最适合您选择可能取决于您设置。默认情况下,此选项是禁用

    72020

    安卓入门-第二章-探究活动

    另外需要注意,如果你应用程序中没有声明任何一个活动作为主活动这个程序仍然可以正常安装,只是你无法启动器中看到或者打开这个程序。...,可以通过findViewById()方法获取到布局文件中定义元素,这里我们传入R.id.button_1 ,来得到按钮实例这个值是刚才first_layout.xml中通过android:id...得到按钮实例之后,我们通过调用setOnClickListener()方法为按钮注册一个监听器,点击按钮时就会执行监听器中onClick()方法。...onDestroy():这个方法活动被销毁之前调用,之后活动状态将变为销毁状态。 onRestart():这个方法活动由停止状态变为运行状态之前调用,也就是活动被重新启动了。...活动明明已经栈顶了,为什么再次启动时候还要创建一个新活动实例呢?别着急,这只是系统默认一种启动模式而已,你完全可以根据自己需要进行修改,比如说使用singleTop模式。

    2.9K20

    别再错了,数字化转型与数据和应用程序无关,而与流程有关

    即使最初步骤仍然是手动这个流程也可以自动化。任务得到分配和监控。通知会发出。步骤不再被遗忘,错误也会越来越少。...相反,从流程框架开始。一份大纲。甚至是一份清单。即使这些步骤仍然是手动这个流程也可以更快地得到管理和自动化。...事实上,大多数航空业飞机维修都是这样工作;即使许多步骤仍然是手动,流程也是自动化引入术前检查清单之后,手术室“意外结果”开始减少了。...活动,它们代表动词,而不是名词。是方法,而不是对象。 流程是思考这个问题一个好方法,也是构建它一个好方法。...9 有时,数据管理解决方案仍然有意义 这并不意味着每个应用程序基本上都是流程应用程序。数据优先方法绝对可以最好地满足许多业务需求。例如,任何涉及商业智能东西。

    31640

    Handler 消息机制原来解析

    Handler 重写 handleMessage 方法 ,然后需要时候调用它 send 以及 post 系列方法可以了,非常简单易用,并且支持延时消息。...Handler一个隐藏构造方法为什么这个最终构造方法是隐藏呢,这就涉及到了异步消息和屏障消息相关API了,这个构造方法里有一个参数是async,表示是否是异步,这个API,默认是隐藏。...这个方法大家应该都很熟悉吧。 这就是为什么子线程里面使用Handler时候,如果不调用Looper.prepare() 方法会抛出异常原因了(就是上面Handler构造方法里面的异常)。...Looper.prepare() 方法只能调用一次,否则会抛异常。 我们平时主线程使用Handler时候并没有调用这个方法,怎么没有抛出异常呢,这个放在后面说。...这些我会讲解一些,没讲到可以自行搜索相关内容进行了解。

    94210

    【C#】带等待窗体BackgroundWorker

    这里简单介绍一下,两个方案共同目的都是执行耗时任务时向用户显示一个模式窗体(称等待窗体),通过该窗体,任务可以向用户报告执行进度,用户也可以通过它干预任务执行(也就是取消~如果任务允许被终止的话...接口 DoWork事件中可以访问一组bgwUI提供属性和方法更新等待窗体上文本和进度,以及可以控制等待窗体上【取消】按钮是否可见。...至于为什么要做这个干预,是因为原活动窗体不会在等待窗体Hide后立即获得焦点,而是要等bgwUI.OnRunWorkerCompleted整个方法执行完才会获得,也就是说,base.OnRunWorkerCompleted...总之根本问题就是,当某个窗体活动状态下弹出模式窗体,那个模式窗体就会不正常,要问如何才能在非活动状态弹出模式窗体,这个可以自己用timer实现。...而为什么会不正常,这个也想知道,还请高人解答 有关IWaitForm和WaitForm请参看上一篇 -文毕-

    1.8K30

    构建故障恢复系统

    因为时间关系,将不会详细描述这个模型细节。简而言之,意思是说: 一个编排微服务架构中,系统每个组成部分都不依靠单一中心控制点,而是涉及有关业务事务工作流程决策。...故障恢复前弹性: 如果其中一个服务实例发生故障,服务职责仍然必须得到满足。微服务应当横向扩展,以允许多个实例,确保如果服务一个实例发生故障,其他实例可以接管并响应调用者服务。...这可以通过通信双方之间建立高可用性队列通信服务来完成。但是,这个方法有一个缺陷,那就是它不适合于单纯同步与实时系统,所以开发人员使用这种策略时,要非常慎重。...为实现弹性更多途径: 简单编排微服务架构中添加了检查点 一个编排微服务架构中,我们可以使用检查点。我们把这个过程称为“活动检查”。...以前,所有这些故障都与整个产品故障相对应,但现在,重试之后,这些故障得到了自动恢复。

    85120

    Android 优化——内存优化

    这种情况很容易发生在短时间内申请大量 对象时,并且它们极少情况下能得到有效释放,这样会出现内存泄漏情况。 一旦达到了剩余内存阈值,垃圾回收活动就会启动。...即使有时内存申请 很小,它们仍然会给应用程序堆内存造成压力,还是会启动垃圾回收, GC 频繁工作过程中消耗了非常多时间,并且可能导致卡顿。...非静态内部类静态实例 非静态内部类会维持一个到外部类实例引用,如果非静态内部类实例是静态,就会间接长期维持着外部类引用,阻止被系统回收。...ActivityRefWatcher,自动监控应用中调用 Activity.onDestroy 之后发生泄漏 Activity。...常见使用方案可以结合 LruCache 来实现, LruCache 移除超出 cache size 图片时,暂时缓存 Bitmap 到一个软引用集合,需要创建新 Bitmap 时,可以这个软引用集合中找到最适合重用

    1.5K10

    已中招!Android 基础面试常常吊死在这几个问题上……

    应聘者:这个是上下文!通过它可以访问application资源和相关类! 面试官:什么是 Activity Context 呢?为什么要用? 应聘者:此上下文 Activity 中可用。...当您需要一个生命周期与当前上下文分开上下文时,或者传递超出活动范围上下文时,可以使用 Application Context 。 2、面试官:什么是 Armv7 ? 应聘者:怎么知道?...OnRestart():Activity停止之后,再次开始之前调用!...Standard 是默认,就是不指定启动模式时候用到这个!其他指定时候使用! 面试官:你糊弄呐?...重复使用一种方法 findViewById() 是使用 “ViewHolder” 设计模式。 19、面试官:MVC,MVP 和 MVVM 有何区别?都有哪些优缺点? 应聘者:这个知道!

    2K20

    【Android】期末简答题

    1.Activity类中定义了7个回调方法,分别是什么? 答案: onCreate()这个方法你已经看到过很多次了,每个活动中我们都重写了这个方法,它会在活动第一次被创建时候调用。...你应该在这个方法中完成活动初始化操作,比如说加载布局、绑定事件等。 onStart()这个方法活动由不可见变为可见时候调用。 onResume()这个方法活动准备好和用户进行交互时候调用。...它和 onPause()方法主要区别在于,如果启动活动是一个对话框式活动,那么 onPause()方法得到执行,而 onStop()方法并不会执行。...onDestroy()这个方法活动被销毁之前调用,之后活动状态将变为销毁状态。 onRestart()这个方法活动由停止状态变为运行状态之前调用,也就是活动被重新启动了。...3.停止:不是栈顶位置,完全不可见,仍然会存一些成员变量内容,当其他 地方需要内存时候会回收。 4.销毁:从返回栈中移除之后,系统最喜欢就是回收这种活动

    98060

    【译】容器环境下 Node.js 内存管理

    当我容器受限环境下分析内存密集型Node.js应用程序时,看到两种情况: OOM-KILLERheapTotal和heapUsed值都高于容器限制之后,隔一段很长时间才执行。...为什么?当活动内存达到容器设置限制时,并且swap space还有空间时,一些旧内存片段将被推送到swap space并可供同一进程使用。...默认情况下,docker分配交换空间量等于通过--memory标志设置内存限制。有了这种机制,这个进程几乎可以使用2GB内存 - 1GB活动内存和1GB交换空间。...简而言之,由于内存交换机制,rss仍然容器强制限制范围内,并且应用程序能够持续运行。...关于Node.js堆大小建议(当你可以控制它,但不能控制容器大小时) 运行一个空Node.js应用程序,并测量空转情况下rss使用情况(Node.js v10.x版本得到值约为20 MB)

    2K10

    设计模式学习笔记|单例模式 Singleton

    很多时候,我们都会以为单例模式是比较好掌握,但是后来学习当中,发现还是有很多问题是没有考虑到,甚至是想象不到。 单例模式是要使类实例在内存中只有一份。...听起来挺容易,但是这个还真是没有想象那么简单。代码使用 Java 来进行描述。...所谓饿汉模式,就是类加载入内存之后,直接实例化一个对象出来;懒汉模式是需要时候再去实例化一个对象出来。 为什么有饿汉模式和懒汉模式呢?这得从它们加载时机来考虑。...实例化多个对象 Java 中提供了反射机制,即使使用单例模式,仍然可以实例化出多个对象。无论是上面的饿汉模式,还是懒汉模式,都可以实例化多个实例。...因此这样,就可以实例化对象出来了,内存中就有了一个类多个实例了。 枚举类单例 枚举很多语言中都有,一般情况就是定义一些有限常量。其实,枚举类中可以定义方法

    33710

    CCAI | 人工智能将来,是否就埋藏在大脑那些神经元突触间美妙电信号中?

    比如语言区域受损就不会说话,视觉皮层受损就会看不见,对此实验我们已经确认过很多次,形成公认认知了:我们可以通过正电子成像方法观察大脑活动——正常人大脑中注入葡萄糖,产生活动地方就会有信号,...不管是在对鱼或者对什么动物脑部实验,还是对人脑部实验里,我们都发现,即使他们不做任何事情时候,脑部也是有许多自发活动,这些活动意义是什么,我们仍然不清楚。...可以理解为:如果大脑经常被同样东西刺激(神经元间产生同样电信号),大脑就会对这个东西越来越敏感。这个说法70、80年代得到了实验证据:电活动可以造成突触长期强化或者长期弱化现象。...计算所实验室里我们已经把这个联接可变性加入进去,发现有很好效果,还有一个就是可塑性传播,LTD传播是我们BP来源,但是LTP为什么可以传播,传播为什么一定要指定,可以有自己逆向传播、侧向传播...现在那个现象发现之后还没有回馈应用到人工神经网络上去,所以我说假如再回馈到人工神经网络上,应该也可以发现这个特性很有用,想说是,我们应该就算是脑科学跟人工智能结合一个最好例子,脑科学可以应用在人工神经网络上

    79570

    【React】383- React Fiber:深入理解 React reconciliation 算法

    本文中,将坚持称它为 React 元素树。 除了 React 元素树之外,框架总是在内部维护一个实例来持有状态(如组件、 DOM 节点等)。...在前面的已经描述了字段alternate、effectTag和nextEfect用途。现在让我们看看为什么我们需要其他字段。...已经在演示中使用了这些函数简化实现。每个函数都需要对一个Fiber节点进行处理,当 React 从树上下来时,您可以看到当前活动Fiber节点发生了变化。...在这个阶段,React 更新DOM并调用变更生命周期之前及之后方法地方。 当 React 进入这个阶段时,它有2棵树和副作用列表。...这是提交阶段第一波之后、第二波之前完成,因此componentWillUnmount中前一个树仍然是current,componentDidMount/Update期间已完成工作是current

    2.5K10

    第五章-处理多窗口 | Electron实战

    Set是唯一元素集合;数组中可以有重复值。选择使用set而不是数组,因为这样更容易删除元素。这个清单显示了如何用JavaScript创建一个Set。 列表5.1 创建一个跟踪新窗口集合: ....; }; 这个createWindow()函数创建一个BrowserWindow实例并将其添加到我们清单5.1中创建一组窗口中。...把这些方法留给读者作为练习。 ---- 结合macOS macOS中,即使所有的窗口都关闭了,许多(但不是所有)应用程序仍然保持打开状态。...例如,如果您关闭了Chrome中所有窗口,应用程序dock中仍然出于活动状态,并且仍然出现在应用程序切换器中。Fire Sale不能做到这点。 在前几张章中,这可能是可以接受。...如果我们想要阻止这种行为,我们必须监听这个事件,并且macOS上运行时有条件地阻止它关闭。 列表5.11 关闭所有窗口时保持应用程序活动状态: .

    4.2K21

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券