Рина Сергеева
Рина Сергеева27. Dezember 2018 01:53

Ein wenig über Speicherlecks und Möglichkeiten, sie zu vermeiden

Was sind Speicherlecks in der Android-Entwicklung?

Die Anwendung erstellt Objekte, sie liegen im Speicher und können sie nach Abschluss ihrer Arbeit nicht löschen.

Warum passiert das?

Java hat seine eigenen Möglichkeiten, den Speicher unbenutzter Elemente zu löschen. Dies ist Garbage Collection .

Der Garbage Collector markiert alle Objekte, die gelöscht werden können, wenn sie nicht referenziert werden. Ein Speicherleck ist einfach eine verlorene Referenz, die darauf hinweist, dass das Objekt nicht gelöscht werden kann.

Die Komplexität dieses Fehlers besteht darin, dass er bis zu einem bestimmten Zeitpunkt nicht sichtbar ist und nicht stören kann.
Es gibt ein gutes Zitat von Benjamin Franklin: „Ein kleines Leck wird ein großes Schiff versenken.“
Speicherlecks nehmen den Arbeitsspeicher der Anwendung in Anspruch. Der Rohspeicher wächst und eines Tages kann Ihre Anwendung langsamer werden und abstürzen . Dies führt zu Unzufriedenheit bei den Benutzern und höchstwahrscheinlich wird die Anwendung entfernt ...


Einer der gefährlichsten Fälle, in denen das Programm die Verbindung zu view verliert. Es scheint, dass diese Ansicht auf dem Bildschirm klein ist. Es sei jedoch daran erinnert, dass Ansicht einen Verweis auf Aktivität (Fragment) hat. Und wenn der Link zum Anzeigen nicht entfernt wird, ist die Aktivität (Fragment) ebenfalls aktiv. Eine Aktivität (Fragment) hat Links zu allen Ansichten auf dem Bildschirm.

Woher weiß ich, ob es Speicherlecks gibt?

Sie können Leakeys Erinnerung auf verschiedene Arten finden. Am einfachsten ist es jedoch, Profiler Android Studio zu verwenden.

Verfahren:

  • Projekt starten
  • Klicken Sie in der unteren Leiste auf Profiler.
  • Wählen Sie "Speicher"
  • Drücken Sie "Force Garbage Collection" (dann müssen Sie etwas warten)
  • Klicken Sie auf "Java-Heap-Dump".
  • Filtern Sie die Liste nach den gewünschten Klassen
  • Zeigen Sie die Anzahl der Objekte an

Die obige Abbildung zeigt, dass es vier Aktivitäts -Objekte gibt. Dies geschah, weil der Programmierer dem Programm erlaubte, Verweise auf view zu verlieren. Und Benutzer lieben es, den Telefonbildschirm zu drehen. Mit jedem Orientierungswechsel wurde die Tätigkeit neu erschaffen, und die alte blieb in den Tiefen der Erinnerung liegen.

Wenn Sie einen interessanteren Weg zum Aufspüren von Speicherlecks suchen, dann schlage ich vor, dass Sie sich mit der Bibliothek LeakCanary vertraut machen.

Wie vermeide ich Speicherlecks?

Hier sind einige Tipps:

eines. Erstellen Sie keine statischen Links zu Ansichten. Statische Felder haben denselben Lebenszyklus wie Ihre Anwendung.

2. Übergeben Sie keine Verweise auf Objekte, die länger leben als das von Ihnen übergebene Objekt. Zum Beispiel: Übergeben Sie keine Runnable -Verweise auf View an die Klasse, da der neue Thread dies weiterhin tun wird leben, auch nachdem die Aktivität neu erstellt wurde.

public class LeakingRunnable implements Runnable {

    private View view;

    LeakingRunnable(View view){       //don't do that!
        this.view = view;
    }
    @Override
    public void run() {
        // do some work
    }
}

Und wie verschiebt man view zu Runnable ?

Verwenden Sie andere Arten von Links.
In Java gibt es neben den üblichen "harten Links" noch andere "weiche Links" und "schwache" . Nennen Sie sie richtig:

  • Schwache Referenz
  • SoftReferenz
  • Phantomreferenz

Das Vorhandensein von "weichen Referenzen" hindert den Garbage Collector nicht mehr daran, die Aktivität zu löschen. Sie können hier mehr darüber lesen: Unterschiede zwischen schwachen, weichen, Phantom- und normalen Links in Java

Ohne Speicherlecks würde der obige Code so aussehen:

public class NoLeakingRunnable implements Runnable {

    @NonNull
    private final WeakReference<View> viewRef;

    public NoLeakingRunnable(@NonNull View view){
        this.viewRef = new WeakReference<>(view);         //do that!
    }
    @Override
    public void run() {
        View view = viewRef.get();
        // do some work
    }
}  

3. Es ist notwendig, innere Klassen zu einer statischen Aktivität zu machen.

Die innere Aktivitätsklasse über den Zugriff auf die Ansicht (und alle anderen Objekte) erstellt synthetische Verweise auf dieses Objekt. Und wenn die innere Klasse länger lebt als die Aktivität, dann tritt ein Speicherleck auf.

In diesem Artikel wurde nur ein kleiner Teil der Informationen darüber erzählt, was ein Speicherleck in der Android-Entwicklung ist und wie man es am einfachsten vermeidet. Es gibt noch viel mehr schwierige Situationen. Einige von ihnen werden in zukünftigen Artikeln besprochen. Abonnieren Sie neue Artikel.

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25. Dezember 2023 10:30
Boost - statisches Verknüpfen im CMake-Projekt unter Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken