Архитектура памяти JVM

Оптимизация кода на Java

Pavlos Kosmetatos

Lead Engineer @Wealthyhood

Что такое JVM?

  • Платформонезависимая среда выполнения
  • Преобразует байткод (.class) в машинный код
  • Управление памятью и сборка мусора
  • JIT-компиляция
Оптимизация кода на Java

Обзор архитектуры памяти JVM

Архитектура памяти JVM

Оптимизация кода на Java

Стековая память

  • Область памяти для выполнения методов и локальных переменных
  • Структура LIFO (последним пришёл — первым вышел)
  • Хранит:
    • Локальные переменные
    • Примитивные типы данных
    • Информацию о вызовах методов
  • StackOverflowError при превышении размера
Оптимизация кода на Java

Память кучи

  • Хранит все объекты и массивы
  • new создаёт объект и размещает его в куче
  • Управляется сборщиком мусора
  • Динамический размер
  • Разделена на поколения
Оптимизация кода на Java

Память в действии

public void processData() {
    int count = 0;                  // Stack

String name = "Java"; // Heap
List<String> items = // Reference on Stack new ArrayList<>(); // Object on Heap
items.add(new String("Item")); // Object on Heap }
Оптимизация кода на Java

Эффективные паттерны работы с памятью

// Inefficient
List<String> list1 = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
    String s = new String("value"); // 1000 objects
    list1.add(s);
}

// Better
List<String> list2 = new ArrayList<>();
String s = "value";  // Single object
for (int i = 0; i < 1000; i++) {
    list2.add(s);
}
Оптимизация кода на Java

Итоги

  • JVM управляет памятью преимущественно через стек и кучу
  • Стек -> быстрый, хранит примитивы и ссылки
  • Куча -> хранит объекты
Оптимизация кода на Java

Давайте потренируемся!

Оптимизация кода на Java

Preparing Video For Download...