Часто такая проблема наблюдается на Android из-за ограниченных ресурсов. Не только с растровым изображением, но и во многих других случаях. Теперь давайте обсудим, как происходит утечка памяти. Чтобы понять память, вам нужно знать об управлении памятью в java.

Как память управляется в java?

Поскольку все мы занимались программированием на C, управление памятью (выделение и освобождение памяти) выполняется вручную с использованием malloc и calloc. А как насчет Java? Никогда не писал и не видел malloc и calloc или каких-либо инструкций по распределению памяти, так как же это происходит?

В java управление памятью - это автоматический процесс, которым управляет сама java.

Но что означает память? В случае памяти мы говорим о динамической памяти. В большинстве конфигураций операционная система заранее выделяет кучу для управления JVM во время работы программы.

Как вы можете видеть на рисунке выше, каждый новый созданный объект размещает свою память в куче. Распределение просто требует некоторую часть массива памяти и перемещает указатель смещения вперед

Хорошо, вот как распределяется память, но мы не можем просто продолжать выделять объекты, потому что в мобильных устройствах память ограничена, и есть максимальные шансы, что у вас закончится память. поэтому одновременно нам нужно выделить и освободить память. Как мы видели, в Java выделение памяти является автоматическим процессом, поэтому освобождение памяти также является автоматическим процессом. Это освобождение поддерживается в Java с помощью так называемого сборщика мусора.

Что такое сборщик мусора?

Сборщик мусора - это программа, которая запускается на виртуальной машине Java и избавляется от объектов, которые больше не используются приложением Java. Это форма автоматического управления памятью.

Как узнать, какой объект не нужен?

Сборщик мусора работает с алгоритмом, который называется отметка и очистка.

Чтобы объяснить это, давайте глубже рассмотрим работу сборщика мусора, которая включает следующие шаги:

шаг-1: маркировка

Первый этап процесса называется маркировкой. Здесь сборщик мусора определяет, какие части памяти используются, а какие нет.

шаг 2: обычное удаление

При обычном удалении удаляются объекты, на которые нет ссылок, а объекты, на которые есть ссылки, и указатели остаются на свободном месте.

шаг 3: удаление с сжатием

Для дальнейшего повышения производительности, помимо удаления объектов, на которые нет ссылок, вы также можете сжать оставшиеся объекты, на которые есть ссылки. Перемещение связанных объектов вместе значительно упрощает и ускоряет выделение новой памяти.

Теперь, когда мы знаем, как управляется память, теперь мы можем перейти к нашей реальной проблеме. Теперь у вас может быть какой-то вопрос.

Память так хорошо управляется в java. Так почему же устройствам иногда не хватает памяти?

Утечка памяти в Java - это когда объект больше не используется, но не может быть собран, потому что на него по-прежнему ссылаются в некоторых других местах приложения. В результате этот неиспользуемый объект занимает ресурс памяти, даже если он не используется приложением. Ваше приложение в конечном итоге выйдет из строя, если слишком много этих неиспользуемых объектов накапливается до такой степени, что не остается достаточно памяти для других активных объектов в вашем приложении. Вы увидите сбой с ошибкой нехватки памяти.

Таким образом, мы можем сказать, что мы не можем винить java в этой ошибке: они как можно лучше управляли памятью. В основном это мы, «Разработчик», несем ответственность за создание такой ошибки.

Как девелоперы несут ответственность?

В процессе написания кода мы, разработчики, создаем множество функций и экземпляров, переменных и т. Д. Если эти функции и переменные слабо удерживаются действием, то или все еще ссылаются на какие-то другие места. Мы точно не сможем подсчитать время работы сборщика мусора. Когда сборщик мусора запускает такую ​​функцию, и переменные или экземпляр не могут быть собраны сборщиком мусора, потому что, несмотря на то, что их работа завершена, но все же они каким-то образом ссылаются на какое-то другое место. Таким образом, эти вещи накапливаются в памяти кучи и будут нести ответственность за нежелательное использование памяти. И когда будет создан новый экземпляр объекта, им не хватит памяти в куче. Таким образом будет выброшено исключение ошибки нехватки памяти.

Как узнать, есть ли утечка памяти?

Мы не можем дождаться возникновения исключения из памяти. Если вы разработчик Android, то есть два метода проверки утечки памяти.

  1. Библиотека Leakcranery для Android
  2. Студия Android