Einführung in LeakCanary, eine Java-Bibliothek zur Erkennung von Speicherlecks.

LeakCanary: Eine Bibliothek zur Erkennung von Speicherlecks für Android und Java.

java.lang.<a href="http://javakk.com/tag/outofmemoryerror" title="查看更多关于 OutOfMemoryError 的文章" target="_blank">OutOfMemoryError</a>
        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)

Niemand mag ** OutOfMemoryError ** Absturz

Im quadratischen Register zeichnen wir die Signatur des Clients in den Bitmap-Cache. Diese Bitmap hat die Größe des Bildschirms des Geräts, und bei der Erstellung sind viele OOM-Abstürze aufgetreten.

Einführung in LeakCanary, eine Java-Bibliothek zur Erkennung von Speicherlecks.

Wir haben verschiedene Methoden ausprobiert, aber keine hat das Problem gelöst:

  • Verwenden Sie Bitmap.Config.ALPHA_8 (für die Signatur ist keine Farbe erforderlich).
  • Fangen Sie OutOfMemoryError ab, lösen Sie GC aus und versuchen Sie es mehrmals (inspiriert von GCUtils).
  • Wir haben nicht darüber nachgedacht, Bitmaps aus dem Java-Heap zuzuweisen. Wir haben noch kein Glück.

Wir haben es falsch verstanden

Die Bitmap-Größe ist kein Problem. Wenn der Speicher fast voll ist, kann OOM überall auftreten. Diese Situation tritt eher auf, wenn große Objekte (z. B. Bitmaps) erstellt werden. OOM ist ein Symptom für ein tieferes Problem: ** Speicherverlust **.

Was ist ein Speicherverlust?

Einige Objekte haben eine begrenzte Lebensdauer. Wenn ihre Arbeit abgeschlossen ist, werden sie Müll gesammelt. Wenn eine Referenzkette ein Objekt nach Ablauf seiner erwarteten Lebensdauer im Speicher speichert, führt dies zu einem Speicherverlust. Wenn sich diese Sicherheitsanfälligkeiten häufen, ist der Speicher der Anwendung erschöpft.

Wenn beispielsweise Activity.onDestroy () aufgerufen wird, sollten die Ansichtshierarchie und die zugehörige Bitmap müllsammelbar sein. Wenn ein im Hintergrund laufender Thread einen Verweis auf die Aktivität enthält, kann der entsprechende Speicher nicht zurückgefordert werden. Dies führte schließlich zum Absturz des OutOfMemoryError.

Suchen Sie nach Speicherlecks

Das Auffinden von Speicherlecks ist ein manueller Vorgang. Die folgenden Schritte sind wichtig:

  1. Erfahren Sie mehr über OutOfMemoryError-Abstürze über Bugsnag, Crashlytics oder die Entwicklerkonsole.
  2. Versuchen Sie, das Problem zu reproduzieren. Möglicherweise müssen Sie das abgestürzte Gerät kaufen, ausleihen oder stehlen. (Nicht alle Geräte lecken!) Sie müssen auch herausfinden, welche Navigationssequenz das Leck ausgelöst hat, das durch Gewalt verursacht werden kann.
  3. Speichern Sie den Heap, wenn OOM auftritt.
  4. Verwenden Sie MAT oder YourKit, um die Müllkippe zu durchsuchen und ein Objekt zu finden, das mit Müll gesammelt werden soll.
  5. Berechnen Sie den kürzesten Weg aus starken Referenzen.
  6. Finden Sie Referenzen heraus, die im Pfad nicht vorhanden sein sollten, und beheben Sie Speicherlecks.

Was ist, wenn eine Bibliothek all dies tun kann, bevor Sie OOM erreichen, sodass Sie sich auf die Behebung von Speicherlecks konzentrieren können?

Stellen Sie LeakCanary vor

LeakCanary ist eine Open-Source-Java-Bibliothek, mit der Speicherlecks in Debug-Versionen erkannt werden.

Schauen wir uns ein Beispiel einer Katze an:

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;

Erstellen Sie eine Instanz von RefWatcher und geben Sie die zu überwachenden Objekte an:

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

Wenn ein Leck erkannt wird, erhalten Sie automatisch eine Leckspur:

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

Wir wissen, dass Sie gerade mit dem Schreiben von Funktionen beschäftigt sind, daher sind wir einfach einzurichten. Mit nur einer Codezeile erkennt LeakCanary automatisch aktive Lecks:

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

Sie erhalten sofort eine Benachrichtigung und eine schöne Anzeige:

Einführung in LeakCanary, eine Java-Bibliothek zur Erkennung von Speicherlecks.

abschließend

Nach dem Aktivieren von LeakCanary haben wir viele Speicherlecks in der Anwendung gefunden und behoben. Wir haben sogar einige Schwachstellen im Android SDK gefunden.

Die Ergebnisse sind erstaunlich. Jetzt wurden Abstürze aufgrund von OOM-Fehlern um 94% reduziert.

Einführung in LeakCanary, eine Java-Bibliothek zur Erkennung von Speicherlecks.

Wenn Sie OOM-Abstürze vermeiden möchten, installieren Sie jetzt LeakCanary!

Einführung in LeakCanary, eine Java-Bibliothek zur Erkennung von Speicherlecks.

Ich denke du magst

Origin blog.csdn.net/doubututou/article/details/112346630
Empfohlen
Rangfolge