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

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

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

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

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

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

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

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


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

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

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

Рәсім:

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

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

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

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

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

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

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

  1. public class LeakingRunnable implements Runnable {
  2.  
  3. private View view;
  4.  
  5. LeakingRunnable(View view){ //don't do that!
  6. this.view = view;
  7. }
  8. @Override
  9. public void run() {
  10. // do some work
  11. }
  12. }

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

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

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

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

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

  1. public class NoLeakingRunnable implements Runnable {
  2.  
  3. @NonNull
  4. private final WeakReference<View> viewRef;
  5.  
  6. public NoLeakingRunnable(@NonNull View view){
  7. this.viewRef = new WeakReference<>(view); //do that!
  8. }
  9. @Override
  10. public void run() {
  11. View view = viewRef.get();
  12. // do some work
  13. }
  14. }

3. Ішкі сыныптарды статикалық әрекет ету керек.

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

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

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

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

Пікірлер

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

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

  • Нәтиже:84ұпай,
  • Бағалау ұпайлары4
Ua

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

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

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

  • Нәтиже:47ұпай,
  • Бағалау ұпайлары-6
Соңғы пікірлер
ИМ
Игорь МаксимовҚар. 22, 2024, 9:51 Т.Қ.
Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii LegotckoiҚаз. 31, 2024, 11:37 Т.Қ.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZEҚаз. 19, 2024, 5:19 Т.Қ.
Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь МаксимовҚаз. 5, 2024, 4:51 Т.Қ.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas5Шілде 5, 2024, 8:02 Т.Қ.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Енді форумда талқылаңыз
f
firstlunoxodАқп. 15, 2025, 1:46 Т.Қ.
Рисование на QGraphicsScene при зажатой кнопке мыши Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
Дмитрий
ДмитрийАқп. 3, 2025, 4:24 Т.Қ.
Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…
NW
Nayo WaiҚаң. 30, 2025, 7:22 Т.Қ.
не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
n
nklyҚаң. 3, 2025, 12:52 Т.Қ.
Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
M
MarselТам. 17, 2023, 12:26 Т.Ж.
OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.

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