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 әзірлеуде жадтың ағып кетуі және оларды болдырмаудың ең оңай жолдары туралы ақпараттың аз ғана бөлігі айтылды. Бұдан да көп қиын жағдайлар бар. Олардың кейбіреулері келесі мақалаларда талқыланады. Жаңа мақалаларға жазылыңыз.