超赞的OOM检测(除了mat以外)

今天看了下微博,扔物线分享了个内存检测的工具:

内存泄露是 OOM 最常见的原因,但它的侦测需人工排查,往往眼看瞎也未必能找到泄露的内存。Square 新库 LeakCanary 用一种巧妙的思路实现了自动探测内存泄露,这已经帮他们减少了94%的 OOM。 在这篇文中,Square 介绍了这个帅气的库,也提出了一种新颖的获取测试设备的方式:"偷":

是不是这种检测OOm问题的方式比其MAT来说简直爽的一逼一逼的。

这是这个检测工具的官网:https://corner.squareup.com/2015/05/leak-canary.html

开源库地址:https://github.com/square/leakcanary

一下是相关翻译:

LeakCanary: Detect all memory leaks!

May 08, 2015

java.lang.OutOfMemoryError
        at android.graphics.Bitmap.nativeCreate(Bitmap.java:-2)
        at android.graphics.Bitmap.createBitmap(Bitmap.java:689)
        at com.squareup.ui.SignView.createSignatureBitmap(SignView.java:121)

没有任何人会喜欢OOM问题的出现

In Square Register, we draw the customer‘s signature on a bitmap cache. This bitmap is the size of the device‘s screen, and we had a significant number of out of memory (OOM) crashes when creating it.

这个图片的大小是设备大小,我们在显示这个图片的时候会出现OOM的问题。

We tried a few approaches, none of which solved the issue:

我们尝试了一些方法,其中没有解决的问题:

  • Use Bitmap.Config.ALPHA_8 (a signature doesn‘t need color).
  • 使用bitmap.config.alpha_8
  • Catch OutOfMemoryError, trigger the GC and retry a few times (inspired from GCUtils).
  • 抓住OutOfMemoryError,触发GC和重试几次(灵感来自gcutils)。
  • We didn‘t think of allocating bitmaps off the Java heap. Lucky for us, Fresco didn‘t exist yet.
  • 我们不想把Java堆分配位图。幸运的是,Fresco 这个开源项目不存在这种问题。

We were looking at it the wrong way

The bitmap size was not a problem. When the memory is almost full, an OOM can happen anywhere. It tends to happen more often in places where you create big objects, like bitmaps. The OOM is a symptom of a deeper problem: memory leaks.

位图是没问题的,如果内存满的话,一个oom会出现在任何地方。当你创建比较大的对象,像bitmap这种东西的地方就会出现这种问题,oom更深层次的问题就是内存泄漏的问题。

What is a memory leak?

什么是内存泄漏呢?

Some objects have a limited lifetime. When their job is done, they are expected to be garbage collected. If a chain of references holds an object in memory after the end of its expected lifetime, this creates a memory leak. When these leaks accumulate, the app runs out of memory.

许多对象是有有限制的生命周期的,当他们工作完成后,就会被垃圾回收。当对象的引用在对象的生命周期后还在持有该引用的话,就会出现内存泄漏的问题。当引用累计到一定一定时候,就会出现OOM的问题。

For instance, after Activity.onDestroy() is called, the activity, its view hierarchy and their associated bitmaps should all be garbage collectable. If a thread running in the background holds a reference to the activity, then the corresponding memory cannot be reclaimed. This eventually leads to an OutOfMemoryError crash.

例如,在Actiivity ondestroy()后,它的视图层次结构及其相关的位图应该都是垃圾收集。如果一个线程在后台运行,持有该activity引用,那么相应的内存不能被回收。这最终导致OutOfMemoryError错误,崩溃。

捕获OOM的问题

Hunting memory leaks is a manual process, well described in Raizlabs’ Wrangling Dalvik series.

捕获OOM的问题是一个手动的过程。

Here are the key steps:

关键步骤如下:

  1. Learn about OutOfMemoryError crashes via BugsnagCrashlytics, or the Developer Console.
  2. 在使用BugsnagCrashlytics以及 Developer Console工具去检测OutOfMemoryError这种问题。
  3. Attempt to reproduce the problem. You might need to buy, borrow, or steal the specific device that suffered the crash. (Not all devices will exhibit all leaks!) You also need to figure out what navigation sequence triggers the leak, possibly by brute force.
  4. 重现问题,你可能需要购买或者借到一些特殊的设备来重现crash问题(并不是所有的设备都会出现这种问题),你需要知道是什么导致内存泄漏的问题,有可能是蛮力(这句翻译的有点怪,我擦)。
  5. Dump the heap when the OOM occurs (here‘s how).
  6. 堆积OOM的问题
  7. Poke around the heap dump with MAT or YourKit and find an object that should have been garbage collected.
  8. 使用MAT或者 YourKit 工具去发现那些对象应该被回收。
  9. Compute the shortest strong reference path from that object to the GC roots.
  10. 计算最短路径的强引用对象的GC根。
  11. Figure out which reference in the path should not exist, and fix the memory leak.
  12. 找出那些引用是不应该存在的,并处理内存对这些引用。

What if a library could do all this before you even get to an OOM, and let you focus on fixing the memory leak?

如果有一个库帮助你在oom问题出现之前去检测OOM的问题,你会去关注如何修复内存引用的问题吗?

介绍使用LeakCanary

LeakCanary is an Open Source Java library to detect memory leaks in your debug builds.

LeakCanary是一个开源项目,通过java库去检测内存泄漏的问题。

Let‘s look at a cat example:

看下下面的例子:

class Cat {
}
class Box {
  Cat hiddenCat;
}
class Docker {
  static Box container;
}

// ...

Box box = new Box();
Cat schrodingerCat = new Cat();
box.hiddenCat = schrodingerCat;
Docker.container = box;

You create a RefWatcher instance and give it an object to watch:

你创造了一个refwatcher实例,给它一个对象去检测:

// We expect schrodingerCat to be gone soon (or not), let‘s watch it.
refWatcher.watch(schrodingerCat);

When the leak is detected, you automatically get a nice leak trace:

当内存检测的时候,你会检测到内存的内存的使用的痕迹。

* GC ROOT static Docker.container
* references Box.hiddenCat
* leaks Cat instance

We know you‘re busy writing features, so we made it very easy to setup. With just one line of code, LeakCanary will automatically detect activity leaks:

public class ExampleApplication extends Application {
  @Override public void onCreate() {
    super.onCreate();
    LeakCanary.install(this);
  }
}

You get a notification and a nice display out of the box:

你能得到通知,并且能够良好的展示在界面上:

Conclusion

After enabling LeakCanary, we discovered and fixed many memory leaks in our app. We even found a few leaks in the Android SDK.

在启用的leakcanary,我们能够发现并修复你APP里面出现的内存泄漏的问题。我们甚至发现了一些 leaks in the Android SDK

The results are amazing. We now have 94% fewer crashes from OOM errors.

结果让人吃惊,能够检测出94%的OOM的问题。

If you want to eliminate OOM crashes, install LeakCanary now!

如果你想消除OOM导致额问题,先学习leakcanary开始

我英语是数学老师教的,如果翻译的不好,请留言指教下我这个小学生,我一定会改正。

时间: 2024-11-05 20:33:08

超赞的OOM检测(除了mat以外)的相关文章

超赞的.NET办公软件库

之前做项目无意中搜到这个网站,一开始以为是国外大牛们的杰作,然后看到联系地址中居然是四川成都,喔...咱们中国人跟老美.印度人比起来也很厉害啊. 这个网站一次性提供了word.excel.ppt.pdf等所有的组件库,还有丰富的案例和帮助文档. 网站首页:http://www.e-iceblue.com/ 帮助文档:http://www.e-iceblue.com/Tutorials.html 废话不多说,以pdf为例: 一.下载pdf组件 下载地址:http://www.e-iceblue.c

超赞的扁平式网页设计

现在不管是App应用还是网站专题,都被"Flat Design"占据了!这已经成为了很多UI设计师首选的设计形态!拟物设计似乎真的开始离我们越来越远.那么扁平化设计的精髓在于:削弱厚重的图片投影,使用细微的纹理.纯色微渐变.以及简洁的界面设计布局和对比强烈的排版,这些设计类似于Win8和Metro UI的界面.本文蓝蓝设计收集了极好的Flat Design网站设计案列,请您欣赏. 更多超赞的扁平式网站设计欣赏:http://www.lanlanwork.com/ Friends of

Science上发表的超赞聚类算法(转)

作者(Alex Rodriguez, Alessandro Laio)提出了一种很简洁优美的聚类算法, 可以识别各种形状的类簇, 并且其超参数很容易确定. 算法思想 该算法的假设是类簇的中心由一些局部密度比较低的点围绕, 并且这些点距离其他有高局部密度的点的距离都比较大. 首先定义两个值: 局部密度以及到高局部密度点的距离: 其中 是一个截断距离, 是一个超参数.?所以相当于距离点i的距离小于的点的个数. 由于该算法只对的相对值敏感, 所以对dc的选择比较鲁棒, 一种推荐做法是选择使得平均每个点

超越纯CSS3,超赞阴影效果推荐-shine.js

前段时间一直在忙微课比赛的事情,博客更新比较少,抱歉,今天抽空一更. 1.简介 前面我们曾经用两篇文章<纯CSS3文字效果推荐>.<CSS3立体文字最佳实践>给大家介绍过利用CSS3 text-shaodwo实现阴影文字.立体文字效果,但是纯css3实现的方式也有局限性,比如大量应用时会延缓页面加载速度,效果的可控制性不强,今天给大家推荐一个js插件来弥补这些缺失,隆重推出shine.js. 大家可以看看这篇文章<Better than Pure CSS3>学学使用方法

aos.js超赞页面滚动元素动画jQuery动画库

插件描述:aos.js是一款效果超赞的页面滚动元素动画jQuery动画库插件.该动画库可以在页面滚动时提供28种不同的元素动画效果,以及多种easing效果.在页面往回滚动时,元素会恢复到原来的状态. 简要教程 aos.js是一款效果超赞的页面滚动元素动画jQuery动画库插件.该动画库可以在页面滚动时提供28种不同的元素动画效果,以及多种easing效果.在页面往回滚动时,元素会恢复到原来的状态. AOS.js 下载          案例演示 安装 可以通过bower来安装aos动画库插件.

程序员减压篇——分享几个超赞的良心网站

上班打代码,下班还在打代码,每天被代码折磨的疲惫不堪的程序员们终于可以趁着中秋小假期放松一下了.但是,我相信可能依然还有部分猿猿们奋战在电脑前线,今天为大家奉上几个超赞的良心网站,帮助猿猿们减压放松. 1. Calm 网站链接:http://www.calm.com/ 这个网站就像它的名字一样“平和”,网站的设计是通过自然图片(阳光下的暖流.流淌的消息等)与缓缓的音乐相结合,帮你在短时间内即可放松下来.同时你不仅可以设定放松时间,还可以改变音频和图像等,很火的一个网站. 2. Do Nothin

Web开发者必备的20款超赞jQuery插件(转载)

jQuery的易扩展性吸引了来自全球的开发者来共同编写jQuery插件.jQuery插件不仅能够增强网站的可用性,有效地改善用户体验,还可以大大减少开发时间.现在的jQuery插件很多,可以根据您的项目需要来选择.这里为您介绍20款非常不错的插件. Creative Radical Web Typography Lettering.js是一个轻量经的.易于使用的jQuery插件,可创造出极具个性的网页排版,是2010年最佳jQuery插件之一. 演示 | 下载 New FancyMoves Jq

基于jQuery8款超赞的评分插件

基于jquery8款超赞的评分插件.这是一款基于jquery.barrating插件实现的,该评级小部件可灵活设置CSS样式.具体效果请查看演示.效果图如下: 在线预览   源码下载 实现的代码. html代码: <section class="section section-examples"> <div class="examples"> <div class="row"> <div class=&q

【Linux】- 六个超赞的字符画生成器

ASCII是一个非常吸引人的字符编码系统,在计算机,通讯设备,以及其他设备中,通过它来用代码表示字符.新生代的人可能会觉得它已经过时了,但是那些熟悉它的人会懂得ASCII是多么的独特.我们在这里为你准备了五个超赞的ASCII字符艺术生成器. 1 GlassGiant ASCII Art GlassGiant ASCII Art  可以把图片转换成ASCII字符艺术-一堆胡乱堆在一起的文字,数字和符号,看上去没有任何意义,直到你往后站一步去看完整的画面.它也没有什么实际的用途,只是看上去非常简洁灵