Рина Сергеева
Рина СергееваЖел. 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 хостинг.

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

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
Г

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

  • Нәтиже:66ұпай,
  • Бағалау ұпайлары-1
t

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

  • Нәтиже:33ұпай,
  • Бағалау ұпайлары-10
t

Qt - Тест 001. Сигналы и слоты

  • Нәтиже:52ұпай,
  • Бағалау ұпайлары-4
Соңғы пікірлер
G
GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
d
dblas5Шілде 5, 2024, 11:02 Т.Ж.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssrАқп. 8, 2024, 6:43 Т.Қ.
Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Енді форумда талқылаңыз
Evgenii Legotckoi
Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
F
FynjyШілде 22, 2024, 4:15 Т.Ж.
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
BlinCT
BlinCTМаусым 25, 2024, 1 Т.Ж.
Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
BlinCT
BlinCTМамыр 5, 2024, 5:46 Т.Ж.
Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
Evgenii Legotckoi
Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

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