Ответ
Размер ссылки на объект (не самого объекта) в 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 байта.