English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Kurzanalyse der Methoden zur Vermeidung von Memory Overflow in Android

Dieser Artikel erläutert Beispiele zur Memory-Overflow-Vermeidung in der Android-Programmierung und teilt Methoden zur Vorbeugung mit. Hier ist eine Zusammenfassung für alle:

 Das virtuelle Maschine von Android basiert auf dem Register-Dalvik, und seine maximale Heap-Größe ist in der Regel16M. Aber Android wird in Java geschrieben, daher ist der Speichermechanismus von Android in großem Maße dem Java-Speichermechanismus gleich. Bei der Entwicklung am Anfang können内存限制问题给我们带来严重的内存溢出等问题。Wenn wir einige Speicher nicht verwenden, sollten wir versuchen, auf anderen Plattformen wie Android, den Speicher zu vermeiden, der bei der Ausführung anderer Programme erforderlich ist, um die Speicherprobleme, die durch tote Prozesse verursacht werden, so weit wie möglich zu reduzieren, indem wir ihn bei der Schließung des Programms oder dem Speichern des Status freigeben, was die Flüssigkeit des Systems bei der Ausführung verbessern kann.

Der Speicher von Android äußert sich hauptsächlich in:

1Auf der Plattform Android führt die lange Aufbewahrung einiger Ressourcenreferenzen zu vielen Speicherleckproblemen. Zum Beispiel: Context (im Folgenden erwähnte Activity sind Context), wenn Sie den Status Ihrer ersten Klasseobjekte beibehalten müssen und diesen Status in andere Klasseobjekte einfügen, müssen Sie die empfangenden Klasseobjekte freigeben, bevor Sie die erste Klasseobjekt entfernen. Zu beachten ist: Da im Java- oder Android-Speichermechanismus vor der Freigabe der Spitzenknoten sicherzustellen ist, dass keine anderen Objekte darauf zugreifen, können sie vom System-GC freigegeben und freigegeben werden. Lassen Sie uns ein Beispielcode sehen:

@Override
protected void onCreate(Bundle state) {
   super.onCreate(state);
   TextView label = new TextView(this);
   label.setText("Leaks are bad");
   setContentView(label);
}

Die Bedeutung dieses Codes ist, dass wir eine Instanz von TextView in das Activity (Context), in dem wir gerade arbeiten, laden. Daher wissen wir durch das Mechanismus des GC-Recyclings, dass wir den Context freigeben müssen, indem wir die Referenzen auf einige seiner Objekte lösen. Wenn nicht, dann finden Sie, dass bei der Freigabe des Contexts eine Vielzahl von Speicherüberläufen auftreten. Daher ist es in Unachtsamkeit sehr einfach, Speicherüberläufe zu verursachen. Beim Speichern einiger Objekte kann auch Speicherleck verursacht werden. Am einfachsten ist das zum Beispiel bei Bitmaps, zum Beispiel: Wenn das Bildschirmrotieren auftritt, wird der aktuelle Activity-Status, der beibehalten wird, zerstört und eine neue Activity angefordert, bis der neue Activity-Status gespeichert wird. Lassen Sie uns ein weiteres Beispielcode sehen:

private static Drawable sBackground;
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
TextView label = new TextView(this);
label.setText("Memory leaks are bad");
if (sBackground == null) {
   sBackground = getDrawable(R.drawable.large_bitmap);
}
label.setBackgroundDrawable(sBackground);
setContentView(label);
}

Dieser Code ist sehr schnell, aber auch falsch. Memory-Leaks können leicht im Bildschirmumschaltungsmodus auftreten. Obwohl wir finden, dass das Context-Objekt nicht explizit gesichert wird, wird der Drawable, wenn er an eine Ansicht angeschlossen wird, als Callback durch den View gesetzt, was bedeutet, dass wir in dem obigen Code tatsächlich die Activity referenziert haben, wenn wir den TextView in die Aktivität zeichnen. Der Verknüpfungszustand kann sich wie folgt darstellen: Drawable->TextView->Context.

Also bleibt der Context, wenn man ihn freigeben will, tatsächlich im Speicher und wird nicht freigegeben.

Wie kann man dieses Problem vermeidenHauptproblem ist, dass Threads am häufigsten Fehler verursachen. Man sollte Threads nicht unterschätzen, in Android verursachen Threads am häufigsten Memory-Leaks. Der Hauptgrund für Memory-Leaks durch Threads liegt in der unkontrollierten Lebensdauer der Threads. Hier ist ein Beispielcode:

public class MyTest extends Activity {
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    new MyThread().start();
  }
  private class MyThread extends Thread{
    @Override
    public void run() {
      super.run();
      //Etwas tun
    }
  }
}

Der Code ist einfach, aber es gibt neue Probleme auf Android, wenn wir den Anzeigeschirm wechseln (Landschaft oder Portrait), wird eine neue Activity für Landschaft oder Portrait neu erstellt. Wir denken bildlich, dass die zuvor erstellte Activity recycelt wird, aber wie ist es tatsächlich? Das Java-Mechanismus gibt Ihnen nicht das gleiche Gefühl, da der run-Function noch nicht beendet ist, daher wird MyThread nicht zerstört und auch der Activity, der es referenziert (Mytest), wird nicht zerstört, was auch ein Memory-Leak-Problem mitbringt.

Einige Leute mögen AsyncTask, den Android anbietet, aber tatsächlich sind die Probleme von AsyncTask viel schlimmer. Thread tritt nur dann ein Speicherleck auf, wenn die run-Funktion nicht endet, aber die Implementierungsmethode von AsyncTask verwendet ThreadPoolExecutor, und das Lebenszyklus der durch dieses Objekt erzeugten Thread-Objekte ist unbestimmt und kann von der Anwendung nicht gesteuert werden. Daher treten Speicherlecks leichter auf, wenn AsyncTask als interne Klasse des Activities verwendet wird.

Die Verbesserungsmöglichkeiten für Thread-Probleme sind hauptsächlich:

① Ändern Sie die interne Klasse des Threads in eine statische interne Klasse.
② Verwenden Sie im Programm so gut wie möglich WeakReferences, um Context zu speichern.

2Böses Bitmap...

Bitmap ist ein sehr böses Objekt. Für ein Speicherobjekt ist es offensichtlich, dass ein Speicherleck auftritt, wenn das Objekt zu groß ist und die Systemspeicherbegrenzung überschritten wird.
Die Lösung für Bitmap besteht darin, sie im Speicher so gut wie möglich nicht zu speichern oder die Bildabtastrate zu verringern. In vielen Fällen, weil die Bildauflösung unserer Bilder sehr hoch ist, und für die Bildschirmgröße des Handys ist es nicht erforderlich, so eine hohe Bildauflösung zu laden, können wir die Bildabtastrate zunächst verringern und die ursprünglichen UI-Operationen durchführen.

Wenn wir die Referenz des Bitmap-Objekts nicht benötigen, können wir auch SoftReferences verwenden, um sie zu ersetzen. Es gibt viele spezifische Beispiele für Code auf Google.

Zusammenfassend lässt sich sagen, dass um Speicherlecks zu vermeiden, hauptsächlich folgende Punkte beachtet werden müssen:

Erstens: Behalten Sie keine langfristigen Referenzen auf Context (wenn Sie Context referenzieren möchten, müssen Sie sicherstellen, dass das Referenzobjekt und sein eigenes Lebenszyklus übereinstimmen).

Zweitens: Wenn Sie Context verwenden müssen, verwenden Sie besser ApplicationContext, da der Lebenszyklus von ApplicationContext länger ist und in Bezug auf Referenzen kein Speicherleck auftreten wird.

Drittens: Vermeiden Sie das Verwenden von statischen Variablen in Ihrem Activity, wenn Sie den Lebenszyklus der Objekte nicht steuern können. Verwenden Sie stattdessen WeakReference, um eine statische zu ersetzen.

Viertens: Der Garbage Collector gewährleistet nicht, dass er den Speicher genau回收,daher müssen wir hauptsächlich die Lebensdauer der von uns benötigten Inhalte verwalten und die nicht benötigten Objekte rechtzeitig freigeben. Versuchen Sie, die von uns referenzierten Objekte in onDestroy freizugeben, wenn das Leben des Activities endet, z.B.: cursor.close().

Tatsächlich können wir in vielen Bereichen weniger Code verwenden, um Programme zu erstellen. Zum Beispiel: Wir können mehr verwenden9Bilder zu patchen usw. Es gibt viele Details, die wir entdecken und mehr Speicherprobleme aufdecken können. Wenn wir es schaffen, C/C++Für das Prinzip 'Wer erstellt, der freigibt' der Programme, unser Verständnis und die Kontrolle über den Speicher sind nicht schlechter als die GC-Mechanismen von Java oder Android selbst, und eine bessere Kontrolle über den Speicher kann den Betrieb unseres Handys flüssiger machen.

Interessierte Leser, die mehr über Android-Themen erfahren möchten, können die Themenbereiche dieser Website überprüfen: 'Zusammenfassung der Techniken zur Speicher- und Cache-Verwaltung in der Android-Entwicklung', 'Einführung und Fortgeschrittene Lehrbücher zur Android-Entwicklung', 'Zusammenfassung der Techniken zur Fehlerbehebung und Lösung häufiger Probleme in der Android-Entwicklung', 'Zusammenfassung der Techniken zur Multimedia-Operation in der Android-Entwicklung (Audio, Video, Aufnahme usw.)', 'Zusammenfassung der Verwendung von grundlegenden Komponenten in Android', 'Zusammenfassung der Techniken zur Verwendung von Android-Views', 'Zusammenfassung der Techniken zur Verwendung von Android-Layouts' und 'Zusammenfassung der Verwendung von Android-Kontrollen'

Wir hoffen, dass der in diesem Artikel beschriebene Inhalt allen bei der Android-Programmgestaltung hilft.

Erklärung: Der Inhalt dieses Artikels wurde aus dem Internet übernommen und gehört dem jeweiligen Urheber. Der Inhalt wurde von Internetbenutzern freiwillig beigesteuert und hochgeladen, die Website besitzt keine Eigentumsrechte, hat den Inhalt nicht manuell bearbeitet und übernimmt keine rechtlichen Verantwortlichkeiten. Wenn Sie verdächtige Urheberrechtsinhalte finden, senden Sie bitte eine E-Mail an: notice#w3Tatsächlich können wir in vielen Bereichen weniger Code verwenden, um Programme zu erstellen. Zum Beispiel: Wir können mehr verwenden

Gefällt mir