Какой размер у ссылки на объект в 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 байта.

Ответ 18+ 🔞

А, слушай, вот это тема, про которую все думают, что знают, а на самом деле нихуя не понимают. Размер ссылки в Java, блядь. Ну, типа, ссылка — это не сам объект, а просто бумажка с адресом, где он лежит. Так вот, размер этой бумажки — это отдельная песня, ёпта.

Смотри, табличку я тебе нарисовал, но сейчас объясню на пальцах, чтобы даже мартышка поняла:

  1. 32-битная JVM — тут всё просто, как три копейки. 4 байта и точка. Потому что 32 бита — это и есть 4 байта, блядь. Всё, что больше, в эту архитектуру просто не влезет. Как слона в унитаз.

  2. 64-битная JVM (обычная, нормальная) — вот тут начинается магия, сука. Казалось бы, раз архитектура 64-битная, то и ссылки должны быть 8 байт, да? А нихуя! Умные дядьки из Oracle придумали Compressed Oops (Compressed Ordinary Object Pointers). Это такая оптимизация, которая ссылки сжимает обратно до 4 байт. Включена по умолчанию, и слава богу, а то память жрали бы как не в себя.

  3. 64-битная JVM с отключенной оптимизацией (-XX:-UseCompressedOops) — а вот это уже для извращенцев, которым мало 32 гигов оперативки для кучи. Если ты такой крутой и у тебя куча больше 32 ГБ, то эту фишку приходится выключать, и тогда ссылки становятся полноценными 8-байтовыми монстрами. Но это, блядь, редкий случай, типа "ой, у меня память не помещается".

Что такое это самое Compressed Oops, спросишь? Представь, что у тебя в гараже (это куча) машины (объекты) стоят строго по линиям, через каждые 8 метров. Тебе не нужно запоминать полный адрес "8-й километр, 352-й метр". Достаточно запомнить номер парковочного места и потом умножить его на 8. Вот эта хитрая жопа и позволяет хранить ссылку в 4 байтах, а не в 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.
    }
}

Итог, блядь, который важен: Не парься. В 99.9% случаев на современной 64-битной Java твоя ссылка будет весить 4 байта. И только если ты какой-то супер-мега-нагруженный сервис пишешь, где нужно дохуя памяти, вот тогда можешь задуматься об этих 8 байтах. А так — живёшь и не знаешь, какая там под капотом магия происходит, ебать её в сраку. Главное — код работает.