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

Можешь ли предсказать сколько памяти будет занимать строка

2.8 Senior🔥 151 комментариев
#JVM и управление памятью

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

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

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

Да, можно предсказать размер строки в памяти

Размер строки в Java зависит от нескольких факторов и имеет чётко определённую структуру.

Структура объекта String в памяти

String в Java состоит из:

  1. Заголовок объекта (Object Header) — 12-16 байт (в зависимости от JVM и архитектуры)
  2. Ссылка на массив символов — 8 байт (в 64-bit JVM)
  3. Значение хеша — 4 байта (может кэшироваться)
  4. Массив char[] — отдельный объект с собственным заголовком

Формула расчёта

// Для строки из N символов:
// Размер String объекта:
// 16 (заголовок) + 8 (ссылка на char[]) + 4 (hash) + padding = ~40 байт
//
// Размер char[] массива:
// 16 (заголовок) + 4 (length) + (N * 2 байт на каждый char) + padding
//
// ИТОГО: ~56 + N*2 байта

Практический пример

import java.lang.management.MemoryMXBean;
import java.lang.management.ManagementFactory;

public class StringMemoryCalculator {
    public static void main(String[] args) {
        // Пустая строка
        String empty = "";
        // Размер: ~40 (String) + 24 (char[]) = ~64 байта
        
        // Строка из 10 символов
        String str10 = "Hello Java";
        // Размер: ~40 (String) + 56 (char[10]) = ~96 байт
        
        // Проверка через объект size
        System.out.println("String размер: " + getObjectSize(str10));
    }
    
    static long getObjectSize(Object obj) {
        return ManagementFactory.getMemoryMXBean()
            .getHeapMemoryUsage().getUsed();
    }
}

Факторы, влияющие на размер

  • Длина строки — каждый символ (char) занимает 2 байта в Unicode
  • Сжатие строк (String Compression, JDK 9+) — если строка содержит только ASCII символы, может занимать 1 байт на символ
  • Кэширование хеша — хеш кэшируется при первом обращении (сохраняет вычисления, но не экономит память)
  • Интернирование строк — одинаковые строки указывают на один объект в String Pool

String Compression в современной Java

// Java 9+ может оптимизировать ASCII строки
String ascii = "Hello";     // может занимать 5 байт вместо 10
String unicode = "Привет";   // займет 12 байт (6 символов * 2)

Инструменты для измерения

// JOL (Java Object Layout) — самый точный способ
ClassLayout layout = ClassLayout.parseInstance("Hello World");
System.out.println(layout.toPrintable());

Выводы

Минимальный размер пустой строки: ~56-64 байта
Размер n-символьной строки: 56 + n*2 байта (без сжатия) или 56 + n байт (с ASCII-сжатием в JDK 9+)

На практике для оптимизации памяти важно учитывать String Interning и избегать создания дублирующихся строк в памяти.