Какой размер у ссылки на объект в Java?

«Какой размер у ссылки на объект в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Размер ссылки на объект (не самого объекта) в Java зависит от разрядности JVM и настроек.

Конфигурация JVM Размер ссылки Примечание
32-битная JVM 4 байта Стандартный размер для 32-битных систем.
64-битная JVM (по умолчанию) 4 байта Благодаря Compressed Oops, включенным по умолчанию.
64-битная JVM с -XX:-UseCompressedOops 8 байт Явное отключение сжатия ссылок (редкий случай, нужен для >32 ГБ кучи).

Что такое Compressed Oops (Compressed Ordinary Object Pointers)? Это оптимизация в 64-битных JVM, которая позволяет хранить ссылки в 4 байтах вместо 8, экономя память. Она работает путем сдвига адресов объектов (обычно на 3 бита), так как объекты в куче выровнены по 8 байтам.

Проверка и пример:

public class ReferenceSize {
    private Object objRef; // Это поле — ссылка. Её размер 4 или 8 байт.

    public static void main(String[] args) {
        // Создаем объект. Переменная 'obj' — это ссылка.
        Object obj = new Object();

        // Размер самого объекта Object — около 16 байт (заголовок + выравнивание).
        // Размер ссылки 'obj' — 4 или 8 байт, как описано в таблице.

        // Узнать настройку Compressed Oops можно так:
        String compressedOops = System.getProperty("sun.arch.data.model");
        System.out.println("Data model: " + compressedOops + "-bit");
        // Или через JMX/ManagementFactory.
    }
}

Практический вывод: В подавляющем большинстве современных 64-битных приложений Java ссылка занимает 4 байта.