Рина Сергеева
Рина СергееваЖел. 27, 2018, 1:53 Т.Ж.

Жадтың ағып кетуі және оларды болдырмау жолдары туралы аздап

Android әзірлеуде жадтың ағуы қандай?

Қолданба нысандарды жасайды, олар жадта қалады және жұмыс аяқталғаннан кейін оларды тазарта алмайды.

Неліктен бұл болып жатыр?

Java-да пайдаланылмаған элементтерден жадты тазалаудың өзіндік құралдары бар. Бұл қоқыс жинау .

Қоқыс жинағыш сілтеме жасалмаса, жоюға болатын барлық нысандарды белгілейді. жадтың ағуы жай ғана нысанды жою мүмкін еместігін көрсететін жоғалған сілтеме болып табылады.

Бұл қатенің күрделілігі белгілі бір уақытқа дейін ол көрінбейді және кедергі жасай алмайды.
Бенджамин Франклиннің жақсы сөзі бар: «Кішкентай ағып кету үлкен кемені суға батырады».
Жадтың ағып кетуі қолданбаның жедел жадын алады. Шикі жад өседі және бір күні қолданбаңыз баяулауы және істен шығуы мүмкін . Бұл пайдаланушылардың наразылығын тудырады және, ең алдымен, қолданба жойылады...


Бағдарлама көру сілтемесін жоғалтатын ең қауіпті жағдайлардың бірі. Бұл көрініс экранда кішкентай болып көрінеді. Дегенмен, көрініс белсенділікке (фрагмент) сілтеме бар екенін есте ұстаған жөн. Ал егер көру сілтемесі жойылмаса, онда Белсенділік (Фрагмент) де тірі. Әрекетте (фрагментте) экрандағы барлық көріністерге сілтемелер бар.

Жадтың ағуы бар-жоғын қалай білуге болады?

Ликидің жадын әртүрлі жолдармен табуға болады. Бірақ ең оңай жолы - Profiler Android студиясын пайдалану.

Рәсім:

  • Жобаны бастау
  • Төменгі жолақта Profiler түймесін басыңыз.
  • «Жадты» таңдаңыз
  • «Қоқысты жинауды мәжбүрлеу» түймесін басыңыз (содан кейін біраз күту керек)
  • «Java Heap Dump» түймесін басыңыз.
  • Қажетті сыныптар бойынша тізімді сүзіңіз
  • Объектілердің санын көру

Жоғарыдағы суретте төрт Әрекет нысаны бар екені көрсетілген. Бұл бағдарламашы бағдарламаға көру сілтемелерін жоғалтуға рұқсат бергендіктен болды. Ал пайдаланушылар телефон экранын айналдыруды жақсы көреді. Бағдар өзгерген сайын әрекет жаңадан жасалды, ал ескісі жадтың тереңдігінде қалды.

Жадтың ағып кетуін анықтаудың қызықты әдісін қаласаңыз, LeakCanary кітапханасымен танысуды ұсынамын.

Жадтың ағып кетуін қалай болдырмауға болады?

Міне, кейбір кеңестер:

1. Көріністерге статикалық сілтемелер жасамаңыз. Статикалық өрістер қолданбаңыз сияқты бірдей өмірлік циклге ие.

2. Сіз өткен нысаннан ұзағырақ өмір сүретін нысандарға сілтемелерді бермеңіз. Мысалы: Runnable сілтемелерін сыныпқа жібермеңіз, өйткені жаңа ағын келесідей болады. әрекетті қайта жасағаннан кейін де өмір сүріңіз.

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
    }
}

Ал көріністі Runnable -ге қалай жылжытуға болады?

Сілтемелердің басқа түрлерін пайдаланыңыз.
Java тілінде әдеттегі «қатты сілтемелерден» басқа «жұмсақ сілтемелер» және «әлсіз» бар. Оларды дұрыс атаңыз:

  • Әлсіз анықтама
  • SoftReference
  • Фантомдық анықтама

«Жұмсақ сілтемелердің» болуы қоқыс жинаушының әрекетті жоюына бұдан былай кедергі болмайды. Олар туралы толығырақ мына жерден оқи аласыз: Java тіліндегі әлсіз, жұмсақ, фантомдық және қалыпты сілтемелер арасындағы айырмашылықтар

Жад ағып кетпесе, жоғарыдағы код келесідей болады:

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. Ішкі сыныптарды статикалық әрекет ету керек.

Көрініске (және кез келген басқа нысандарға) қатынасу туралы ішкі әрекет класы сол нысанға синтетикалық сілтемелер жасайды. Ал егер ішкі сынып белсенділіктен ұзағырақ өмір сүрсе, онда жадтың ағып кетуі орын алады.

Бұл мақалада Android әзірлеуде жадтың ағып кетуі және оларды болдырмаудың ең оңай жолдары туралы ақпараттың аз ғана бөлігі айтылды. Бұдан да көп қиын жағдайлар бар. Олардың кейбіреулері келесі мақалаларда талқыланады. Жаңа мақалаларға жазылыңыз.

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
OI
  • Ora Iro
  • Жел. 24, 2024, 2:38 Т.Қ.

C++ - Тест 001. Первая программа и типы данных

  • Нәтиже:40ұпай,
  • Бағалау ұпайлары-8
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Нәтиже:50ұпай,
  • Бағалау ұпайлары-4
m
  • molni99
  • Қаз. 26, 2024, 8:37 Т.Ж.

C++ - Тест 004. Указатели, Массивы и Циклы

  • Нәтиже:80ұпай,
  • Бағалау ұпайлары4
Соңғы пікірлер
ИМ
Игорь МаксимовҚар. 22, 2024, 7:51 Т.Қ.
Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii LegotckoiҚаз. 31, 2024, 9:37 Т.Қ.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZEҚаз. 19, 2024, 3:19 Т.Қ.
Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь МаксимовҚаз. 5, 2024, 2:51 Т.Қ.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas5Шілде 5, 2024, 6:02 Т.Қ.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Енді форумда талқылаңыз
Evgenii Legotckoi
Evgenii LegotckoiМаусым 24, 2024, 10:11 Т.Қ.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey1Қар. 15, 2024, 2:04 Т.Қ.
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProjectМаусым 4, 2022, 10:49 Т.Ж.
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9AnonimҚаз. 25, 2024, 4:10 Т.Қ.
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

Бізді әлеуметтік желілерде бақылаңыз