成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

LeakCanary:檢測所有的內存泄漏

移動開發
在Square的注冊過程中,我們在bitmap上 繪制了一個用戶的簽名。這個bitmap和設備的屏幕大小相當,在創建它的時候,我遇到了相當數量的OOM導致的崩潰。這樣的問題怎么下手處理掉!

 原文: LeakCanary: Detect all memory leaks! 

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

沒人喜歡OutOfMemoryError

在Square的注冊過程中,我們在bitmap上 繪制了一個用戶的簽名。這個bitmap和設備的屏幕大小相當,在創建它的時候,我遇到了相當數量的OOM導致的崩潰。

signature.png

我們試過了幾種方法,沒有一個解決了我們的問題:

  • 使用Bitmap.Config.ALPHA_8(簽名是不需要顏色的)

  • 捕獲OutOfMemoryError,觸發垃圾回收然后重試幾次(從GCUtils 獲得的啟發)

  • 我們沒有考慮過將bitmap分配在堆內存之外,那個時候Fresco 還沒出現。

我們看待問題的方式是不對的

bitmap的大小本身不是什么問題。當內存快要滿了的時候,OOM隨時隨地都可能發生。尤其是在創建大對象的時候更容易發生,比如bitmap。OOM一般代表著更深層次的問題:內存泄漏。

什么是內存泄漏?

有些對象只有有限的生命周期。當它們的任務完成之后,它們將被垃圾回收。如果在對象的生命周期本該結束的時候,這個對象還被一系列的引用,這就會導致內存泄漏。隨著泄漏的累積,app將消耗完內存。

比如,在Activity.onDestroy()被調用之后,view樹以及相關的bitmap都應該被垃圾回收。如果一個正在運行的后臺線程繼續持有這個Activity的引用,那么相關的內存將不會被回收,這最終將導致OutOfMemoryError崩潰。

尋找內存泄漏

尋找內存泄漏是一個人工操作的過程,在Raizlabs的 Wrangling Dalvik 系列中描述得很清楚。

下面是關鍵的步驟:

  1. 通過 BugsnagCrashlytics, 或者 Developer Console了解OOM

  2. 主動重現問題。你可能需要買或者借或者偷一個遭遇了崩潰的特殊設備(并不是所有的設備上都會發生內存泄漏!)。你還需要找出是什么串在一起導致了內存泄漏。

  3. 當OOM出現時進行堆轉儲(dump the heap)(這里介紹了如何做).

  4. 使用MAT或YourKit內存檢測工具檢測內存的變化,并找出哪個對象應該被垃圾回收;

  5. 從那個對象到GC roots推斷最短的強引用路徑;

  6. 在路徑中找出不存在的引用,并修復memory leak;

要是有一個庫可以為你做完所有的事情,讓你專注于修復內存泄漏的問題,那該有多好。

LeakCanary介紹

LeakCanary 是一個開源的在debug版本中檢測內存泄漏的java庫。

讓我們來看看一個cait的例子:

  1. class Cat { 
  2. class Box { 
  3.   Cat hiddenCat; 
  4. class Docker { 
  5.   static Box container; 
  6.   
  7. // ... 
  8.   
  9. Box box = new Box(); 
  10. Cat schrodingerCat = new Cat(); 
  11. box.hiddenCat = schrodingerCat; 
  12. Docker.container = box; 

創建一個RefWatcher實例,然后給它一個對象讓它觀察:

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

當檢測出泄漏的時候,你會自動得到一個漂亮的泄漏線索:

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

我們知道你的時間寶貴,因此我們讓它非常好設置。只需幾行代碼,LeakCanary就能自動檢測Activity的泄漏:

  1. public class ExampleApplication extends Application { 
  2.   @Override public void onCreate() { 
  3.     super.onCreate(); 
  4.     LeakCanary.install(this); 
  5.   } 

 

當內存不足時,會有一個通知和良好的展示界面:

leaktrace.png

結論

在啟用LeakCanary之后,我們發現和修復了許多內存泄漏的問題。我們甚至發現了一些 Android SDK中的泄漏

結果是非常令人驚奇的,我們現在減少了94%的oom崩潰問題。

oom_rate.png

如果你想終結OOM崩潰,現在就安裝LeakCanary!

責任編輯:倪明 來源: Square engineering blog
相關推薦

2023-10-31 16:40:38

LeakCanary內存泄漏

2017-05-23 21:00:47

Android開源項目內存泄漏

2018-12-07 10:52:08

內存泄漏方法

2010-09-25 11:07:45

Java內存泄漏

2011-06-16 09:28:02

C++內存泄漏

2009-06-16 11:20:22

內存泄漏

2010-09-26 15:38:33

JVM內存泄漏

2024-07-03 11:28:15

2022-09-28 10:35:31

JavaScript代碼內存泄漏

2015-04-17 10:35:51

c++c++程序內存泄漏檢測代碼

2021-03-04 17:21:49

內存檢測泄漏

2024-03-11 08:22:40

Java內存泄漏

2023-12-18 10:45:23

內存泄漏計算機服務器

2012-02-22 21:28:58

內存泄漏

2024-12-05 08:58:47

2015-03-30 11:18:50

內存管理Android

2021-08-09 09:54:37

內存泄漏JS 阿里云

2021-08-05 15:28:22

JS內存泄漏

2019-01-30 18:24:14

Java內存泄漏編程語言

2020-06-08 09:18:59

JavaScript開發技術
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产一区三区视频 | 99av成人精品国语自产拍 | 国产精品成人一区二区三区 | 欧美成视频在线观看 | 国产成人精品999在线观看 | 亚洲一区在线日韩在线深爱 | 91资源在线| 欧美aaa | www成人免费| 国产精品大片在线观看 | 日韩欧美中文字幕在线视频 | 欧美国产亚洲一区二区 | 日韩午夜精品 | 中文字幕成人在线 | 亚洲高清久久 | 久久精品在线播放 | 蜜桃毛片 | 国产成人精品a视频一区www | 亚洲一区二区三区四区五区中文 | www国产亚洲精品 | 久久99网站 | 久久网亚洲 | 日韩精品一区二区三区中文在线 | 日本成人片在线观看 | 亚洲成人av | 亚洲一区不卡 | 亚洲精品电影在线观看 | www国产亚洲精品 | 欧美一区二区黄 | 99re热这里只有精品视频 | 国产一区二区欧美 | 国产精品美女久久久久aⅴ国产馆 | 伊人网在线综合 | 日韩av一区二区在线 | 91精品久久久久久久久中文字幕 | 久久久久亚洲国产| 国产欧美日韩一区二区三区在线观看 | 精品伊人 | 91精品久久久久久久久中文字幕 | 91亚洲精品久久久电影 | 91视频一区二区三区 |