2017-03-20 6 views
0

Ich weiß, es gibt viele Diskussionen über Speicherverlust/Umgang mit Speicherverlusten in Android-Apps, aber kann es dynamisch behandelt werden.Handle Speicherverlust dynamisch

Ich habe gerade diese Frage in einem meiner Interviews. Die Frage war

Wie Speicherverlust erkennen, wenn Anwendung auf Benutzergerät ausgeführt wird und die Daten vor dem Absturz speichern (OutOfMemoryError).

ich, bis ein BaseActivity erraten kann, so etwas wie nur ein BaseActivity für alle Aktivitäten machen und die Daten in OnStop speichern().

Ich kann auch erraten, Error Klasse in der BaseActivity zu erweitern, aber leider unterstützt Java keine Mehrfachvererbung und auch gibt es keine bestimmte Methode in Error Klasse, um Fehler AFAIK dynamisch zu erkennen.

Ich könnte falsch in den obigen Fällen.

Gibt es eine andere Möglichkeit, dies zu tun?

Antwort

1

Ich würde wahrscheinlich den gleichen Ansatz wie Leakcanary verwenden. Sie können darüber lesen here.

Kurz gesagt, erzeugen sie schwache Referenzen zwischen Objekten. Nach GC prüfen sie, ob die Referenz gelöscht wird. Wenn nicht, werfen sie einen Haufen und analysieren einen Speicherauszug. Analyzer berechnet den kürzesten starken Referenzpfad zu den GC-Roots, um festzustellen, ob ein Leck vorliegt, und erstellt dann die Kette von Referenzen, die das Leck verursachen. In diesem Moment können Sie alle Daten, die Sie benötigen, speichern, wenn ein Leck vorhanden ist.

Problem ist, dass, wenn Sie alle Daten speichern möchten, müssen Sie all dies auf Haupt-Thread tun. Ansonsten kann die App geschlossen werden, Daten können verloren gehen usw.

+0

Es ist wirklich eine gute Technik. Kannst du mir aber klar machen, wie eine schwache Referenz hier geholfen hat, das Leck zu ermitteln? – Ranjit

+1

Es hilft Ihnen nicht, ein Leck zu finden, es hilft Ihnen, kein neues zu erstellen. Wenn Sie einen schwachen Verweis auf ein Objekt haben, wird dieses Objekt per GC entfernt. Das ist also die einzige sichere Möglichkeit, das Objekt zu verfolgen und die Garbage-Collection dieser Objekte nicht zu beeinträchtigen. Um zu sehen, ob ein Objekt durchgelaufen ist, müssen Sie seinen Lebenszyklus verfolgen. Wenn z. B. "onDestroy()" in Aktivität aufgerufen wird, gibt es keinen Grund dafür, dass diese Aktivität im Speicher gehalten wird. Wenn also in einem Objekt ein starker Verweis auf diese Aktivität vorhanden ist, verliert dieses Objekt Speicher. –

+1

Danke für die Erklärung. :) – Ranjit