← Назад к вопросам

Какие знаешь виды памяти?

1.0 Junior🔥 111 комментариев
#JVM и память#Производительность и оптимизация

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Виды памяти в Android

В Android существует несколько типов памяти с разными характеристиками.

1. RAM (оперативная память)

Heap:

  • Память для объектов Java
  • Управляется Garbage Collector
  • Ограничена размером (обычно 128-512MB)
val obj = MyObject()  // Выделяется в Heap
val list = mutableListOf<String>()  // В Heap
var name = "John"  // Обычно оптимизируется в String Pool

Stack:

  • Память для локальных переменных
  • Управляется автоматически
  • Быстрее, чем Heap
  • Ограничена (обычно 1-8MB)
fun example() {
    val x = 10  // На Stack
    val y = 20  // На Stack
    val obj = MyObject()  // Ссылка на Stack, объект в Heap
}

2. ROM (постоянная память)

Internal Storage:

  • Приватное хранилище приложения
  • Не видно другим приложениям
  • Удаляется при удалении приложения
// Сохранение файла
val file = File(context.filesDir, "data.txt")
file.writeText("Hello")

// Чтение
val content = file.readText()

External Storage:

  • Общее хранилище (SD card или вспомогательное)
  • Видно другим приложениям
  • Требует разрешений
// Требует WRITE_EXTERNAL_STORAGE
val file = File(Environment.getExternalStorageDirectory(), "myfile.txt")

3. Cache Memory

App Cache:

  • Временные данные
  • Может быть очищено системой
  • Не требует разрешений
val cacheDir = context.cacheDir
val cacheFile = File(cacheDir, "temp.txt")

4. Shared Preferences

val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE)

// Сохранение
prefs.edit().apply {
    putString("username", "John")
    putInt("age", 30)
    apply()
}

// Чтение
val username = prefs.getString("username", "default")

5. SQLite Database

@Entity
data class User(
    @PrimaryKey val id: Int,
    val name: String
)

@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}

6. Memory Profiler для отладки

Android Studio → Profiler → Memory
- Native Memory
- Graphics Memory  
- Bitmap Memory
- Java Objects

Сравнение типов памяти

ТипСкоростьРазмерДоступСохранение
StackОчень быстроМаленькийПрограммеСессия
HeapБыстроСреднийПрограммеGC удалит
CacheБыстроСреднийПриложениюДо 100MB
InternalМедленноБольшойПриложениюПостоянно
ExternalМедленноБольшойВсемПостоянно
SQLiteМедленноБольшойПриложениюПостоянно

Memory Leaks - утечки памяти

// ПЛОХО: утечка через static reference
class MyActivity : AppCompatActivity() {
    companion object {
        var instance: MyActivity? = null  // Утечка!
    }
    
    init {
        instance = this
    }
}

// ХОРОШО: использовать WeakReference
class MyActivity : AppCompatActivity() {
    companion object {
        var instance: WeakReference<MyActivity>? = null
    }
    
    init {
        instance = WeakReference(this)
    }
}

OutOfMemoryError - переполнение памяти

// ПРОБЛЕМА: создание больших списков
val hugeList = mutableListOf<LargeObject>()
for (i in 0..1000000) {
    hugeList.add(LargeObject())
}  // OutOfMemoryError!

// РЕШЕНИЕ: использовать Stream или Iterator
var count = 0
while (count < 1000000) {
    processObject()
    count++  // Не создаем список
}

Оптимизация памяти

✅ Делай так:

  • Используй примитивные типы где возможно
  • Кешируй ресурсы
  • Очищай references при finish()
  • Используй WeakReference для callback'ов
  • Мониторь память в Profiler

❌ Избегай:

  • Static references на UI объекты
  • Больших массивов в памяти
  • Утечек через listeners
  • Неиспользуемых объектов

Мониторинг памяти

// Получить информацию о памяти
val runtime = Runtime.getRuntime()
val maxMemory = runtime.maxMemory() / (1024 * 1024)
val totalMemory = runtime.totalMemory() / (1024 * 1024)
val freeMemory = runtime.freeMemory() / (1024 * 1024)

println("Max: ${maxMemory}MB, Total: ${totalMemory}MB, Free: ${freeMemory}MB")

// Форсировать сборку мусора
System.gc()  // Не рекомендуется!

Вывод

Виды памяти в Android:

  1. Stack - локальные переменные (быстро, ограничено)
  2. Heap - объекты Java (управляется GC)
  3. Internal Storage - приватное хранилище
  4. External Storage - общее хранилище
  5. Cache - временные данные
  6. SharedPreferences - ключ-значение
  7. SQLite - реляционная БД

Правильное управление памятью критично для производительности приложения.

Какие знаешь виды памяти? | PrepBro