Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍3
Это мощный инструмент для обнаружения утечек памяти в Android-приложениях. Он работает, отслеживая жизненный цикл объектов и анализируя пути их удержания, чтобы определить, существуют ли объекты, которые не могут быть освобождены сборщиком мусора (Garbage Collector).
LeakCanary интегрируется с жизненным циклом Activity и Fragment с помощью своих наблюдателей (
ActivityRefWatcher и FragmentRefWatcher). Эти наблюдатели отслеживают, когда Activity или Fragment был уничтожен и должен быть собран сборщиком мусора.Когда Activity или Fragment должен быть уничтожен, LeakCanary создает слабую ссылку (
WeakReference) на этот объект. Слабые ссылки позволяют сборщику мусора освободить объект, даже если на него есть слабые ссылки.val weakReference = WeakReference(activity)
LeakCanary инициирует сборку мусора и ждет, чтобы проверить, была ли освобождена слабая ссылка. Он вызывает метод
System.gc() несколько раз, чтобы попытаться заставить сборщик мусора освободить память.System.gc()
После вызова сборки мусора LeakCanary проверяет, является ли слабая ссылка
null. Если слабая ссылка не равна null, это означает, что объект все еще удерживается в памяти и, вероятно, существует утечка памяти.if (weakReference.get() != null) {
// Утечка памяти обнаружена
}Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5👾1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥1
Если объект не был освобожден после попыток вызвать сборку мусора, LeakCanary создает дамп памяти.
LeakCanary использует библиотеку
Shark для анализа дампа памяти. Он проверяет все объекты в куче и их ссылки.Shark проверяет, какие ссылки удерживают объект в памяти. Если объект должен был быть собран, но удерживается цепочкой ссылок, это указывает на утечку. Цепочка удержания показывает, какие объекты и ссылки не позволяют сборщику мусора освободить память.
Например, если
Activity удерживается статическим полем или через долгоживущий объект (например, Singleton), который не был правильно освобожден.Shark анализирует пути от корневых объектов (root objects), таких как статические поля или глобальные переменные, к удерживаемому объекту.
RootObject -> Singleton -> Activity
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3👀1
Сильная ссылка - это ссылка, которая напрямую указывает на объект и предотвращает его сборку сборщиком мусора.
Использование слабых ссылок (
WeakReference) позволяет определить, был ли объект освобожден сборщиком мусора.LeakCanary использует
ObjectWatcher для отслеживания объектов. Если объект не освобожден, ObjectWatcher уведомляет об утечке.import java.lang.ref.WeakReference;
public class MemoryLeakExample {
public static void main(String[] args) {
// Создание объекта
MyObject myObject = new MyObject();
// Создание слабой ссылки на объект
WeakReference<MyObject> weakRef = new WeakReference<>(myObject);
// Удаление сильной ссылки
myObject = null;
// Вызов сборщика мусора
System.gc();
// Проверка, была ли слабая ссылка освобождена
if (weakRef.get() == null) {
System.out.println("Object has been garbage collected");
} else {
System.out.println("Object is still alive");
}
}
static class MyObject {
// Некоторая логика класса
}
}
Убедитесь, что на объект нет сильных ссылок. Только слабые, мягкие или фантомные ссылки не предотвращают сборку объекта.
Если объект становится недоступным через сильные ссылки, сборщик мусора может его освободить.
Слабые ссылки могут быть использованы для проверки того, был ли объект освобожден.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥2
Использует комбинацию слабых ссылок (
WeakReference), анализ кучи и цепочек удержания, чтобы найти ссылки на уничтоженные Activity или другие объекты, которые должны были быть освобождены сборщиком мусора. Вот более подробное объяснение того, как это работает:Когда Activity (или другой компонент) уничтожается, LeakCanary создает слабую ссылку на этот объект.
val weakReference = WeakReference(activity)
LeakCanary инициирует сборку мусора, чтобы попытаться освободить уничтоженный объект.
System.gc()
System.runFinalization()
LeakCanary проверяет, освобождена ли слабая ссылка. Если объект не был освобожден, это указывает на возможную утечку памяти.
if (weakReference.get() != null) {
// Объект все еще удерживается в памяти, вероятна утечка
}Если слабая ссылка не была освобождена, LeakCanary создает снимок кучи (heap dump) для дальнейшего анализа.
val heapDumpFile = createHeapDump()
LeakCanary использует библиотеку Shark для анализа снимка кучи. Shark проверяет все объекты в куче и их удерживающие ссылки.
val heapAnalyzer = HeapAnalyzer()
val analysis = heapAnalyzer.analyze(heapDumpFile)
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
Является сложной задачей, так как такие объекты обычно собираются сборщиком мусора (GC) и освобождаются из памяти. Тем не менее, есть несколько подходов, которые могут помочь в обнаружении таких объектов в памяти, особенно при отладке или анализе утечек памяти.
В Android Studio можно создать дамп памяти, выбрав опцию "Dump Java heap" в профайлере.
Используйте инструменты, такие как
MAT (Memory Analyzer Tool) или встроенные инструменты Android Studio, чтобы проанализировать дамп памяти. Найдите объекты, которые не должны быть в памяти. Смотрите на "Unreachable objects" или "Dominators".Откройте профайлер Android Studio и подключитесь к запущенному приложению. Нажмите "Heap Dump" для создания дампа памяти.
Откройте дамп памяти в MAT. Используйте запросы, такие как "Find Leaks" или "Top Consumers", чтобы найти объекты, которые не освобождаются.
Слабые ссылки позволяют отслеживать объекты и определять, были ли они освобождены сборщиком мусора.
import java.lang.ref.WeakReference;
public class WeakReferenceExample {
public static void main(String[] args) {
MyObject myObject = new MyObject();
WeakReference<MyObject> weakRef = new WeakReference<>(myObject);
// Удаление сильной ссылки
myObject = null;
// Вызов сборщика мусора
System.gc();
// Проверка, была ли слабая ссылка освобождена
if (weakRef.get() == null) {
System.out.println("Object has been garbage collected");
} else {
System.out.println("Object is still alive");
}
}
static class MyObject {
// Некоторая логика класса
}
}
Используйте специализированные инструменты для обнаружения утечек памяти и анализа использования памяти.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🔥1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3
Может быть достигнуто с использованием различных подходов в зависимости от ваших требований.
Вы можете использовать
Handler и Runnable для отложенного выполнения задач и сохранения объекта на определенное время в памяти.CountDownTimer может быть использован для выполнения задачи через определенное время, что может быть полезно для освобождения объекта.ScheduledExecutorService предоставляет методы для планирования задач с задержкой или периодическим выполнением.Использование слабых ссылок (
WeakReference) позволяет вам контролировать срок жизни объекта в памяти, но при этом объект может быть собран сборщиком мусора, если на него больше нет сильных ссылок.Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥3
Система определяет, что объект, на который ссылается
WeakReference, можно очистить, используя механизм сборщика мусора (Garbage Collector, GC).Сильные ссылки (Strong Reference): Объекты, на которые имеются сильные ссылки, не подлежат сборке мусора.
Слабые ссылки (Weak Reference): Объекты, на которые имеются только слабые ссылки, могут быть собраны сборщиком мусора.
Когда создается
WeakReference, она содержит слабую ссылку на объект, позволяя GC собирать объект, даже если WeakReference все еще существует.MyObject myObject = new MyObject();
WeakReference<MyObject> weakRef = new WeakReference<>(myObject);
Определение доступности объекта: GC проверяет объекты в памяти и их ссылки. Если на объект нет сильных ссылок (только слабые), он считается недоступным и подлежит сборке.
Сборка мусора: GC освобождает память, занимаемую объектом, и удаляет записи о слабых ссылках.
Очистка WeakReference: Когда объект собирается, WeakReference автоматически очищается, и метод get() начинает возвращать null.
После создания слабой ссылки и удаления сильной ссылки, объект становится кандидатом на сборку мусора. После вызова
System.gc(), если на объект больше нет сильных ссылок, он будет собран, а WeakReference будет очищена.Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥1
Автоматическое обнаружение проблем с отрисовкой в Android-приложениях может быть выполнено с использованием различных инструментов и техник.
Choreographer - это класс, который позволяет получить информацию о времени отрисовки кадра. Вы можете использовать его для отслеживания задержек в отрисовке.Android Studio предоставляет встроенные инструменты профилирования, которые могут помочь обнаружить проблемы с производительностью, включая задержки в отрисовке.
Откройте Android Studio и запустите свое приложение. Перейдите в раздел
View -> Tool Windows -> Profiler.Выберите ваше устройство и процесс. Нажмите на вкладку
CPU для профилирования использования процессора. Нажмите на вкладку Graphics для мониторинга отрисовки и обновления экрана.Просмотрите данные, чтобы определить, какие части вашего кода вызывают задержки в отрисовке. Обратите внимание на длинные фреймы (кадры), которые могут указывать на проблемы.
Вы можете использовать
adb shell dumpsys gfxinfo для получения информации о времени отрисовки кадров.adb shell dumpsys gfxinfo <your-package-name> framestats
Команда предоставляет информацию о каждом кадре, включая время его отрисовки. Вы можете анализировать вывод, чтобы найти кадры, которые заняли больше времени, чем ожидается (больше 16.67 мс).
Начиная с API 24 (Android 7.0), вы можете использовать
FrameMetrics API для получения подробной информации о производительности отрисовки.Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍4
Запрос данных из двух таблиц обычно выполняется с помощью операции объединения (JOIN) в SQL. Алгоритм и его сложность зависят от типа объединения, структуры данных и используемой базы данных.
Предположим, у нас есть две таблицы:
employees и departments. Мы хотим получить список сотрудников вместе с их отделами.SELECT employees.name, departments.name
FROM employees
INNER JOIN departments ON employees.department_id = departments.id;
Для каждой строки из первой таблицы выполняется поиск соответствующих строк во второй таблице.
for each row in employees:
for each row in departments:
if row.employees.department_id == row.departments.id:
yield (row.employees.name, row.departments.name)
Создается хеш-таблица для одной из таблиц на основе ключа соединения. Для каждой строки из другой таблицы проверяется наличие соответствующего ключа в хеш-таблице.
hash_table = {}
for each row in departments:
hash_table[row.id] = row.name
for each row in employees:
if row.department_id in hash_table:
yield (row.name, hash_table[row.department_id])Обе таблицы сортируются по ключу соединения, затем выполняется слияние отсортированных списков.
sorted_employees = sort(employees, key=lambda x: x.department_id)
sorted_departments = sort(departments, key=lambda x: x.id)
i, j = 0, 0
while i < len(sorted_employees) and j < len(sorted_departments):
if sorted_employees[i].department_id == sorted_departments[j].id:
yield (sorted_employees[i].name, sorted_departments[j].name)
i += 1
j += 1
elif sorted_employees[i].department_id < sorted_departments[j].id:
i += 1
else:
j += 1
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
😁2👍1💊1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3
Для оптимизации запросов к базам данных можно использовать различные структуры данных и индексы, которые ускоряют операции поиска и соединения.
B-деревья и их модификация, B+-деревья, являются сбалансированными деревьями поиска, которые широко используются для построения индексов в базах данных.
Быстрый поиск, вставка и удаление: Операции поиска, вставки и удаления выполняются за O(log n).
Эффективное использование дискового пространства: B-деревья хорошо подходят для хранения на диске, так как минимизируют количество операций ввода-вывода.
Хеш-таблицы используются для быстрого доступа к данным по ключу. В базах данных часто используются хеш-индексы.
Мгновенный доступ: Операции поиска, вставки и удаления выполняются в среднем за O(1).
Подходят для равенств: Эффективны для запросов с условием равенства (например, WHERE id = 123).Неэффективны для диапазонов: Хеш-индексы не подходят для запросов с диапазонами (например, WHERE age BETWEEN 20 AND 30).
Bitmap индексы используют битовые карты для представления данных и часто используются для столбцов с низкой кардинальностью (небольшое количество уникальных значений).
Эффективное хранение: Особенно эффективны для столбцов с низкой кардинальностью.
Быстрые логические операции: Позволяют быстро выполнять логические
Неэффективны для частых обновлений: Не подходят для таблиц с частыми операциями вставки и обновления.
Реверсные индексы используются для полнотекстового поиска. Они хранят сопоставления терминов и документов, в которых эти термины встречаются.
Быстрый полнотекстовый поиск: Позволяют эффективно выполнять поиск по текстовым данным.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🤯1