Введение
Содержит ли Java-объект:
- поля, объявленные в суперклассе?
- private поля, объявленные в суперклассе?
- методы?
- элементы массива?
- длину массива?
- другой объект (в себе)?
- hash-код?
- тип (свой)?
- имя (своё)?
Ответы на эти (и другие) вопросы можно получить с помощью библиотеки классов org.openjdk.jol которая, в частности, позволяет уяснить, что объект — это область памяти:
- содержащая:
- заголовок (до 16 байт), и в нём:
- hash-код
- ссылку на тип
- длину массива (для массива)
- все поля (включая private), объявленные во всех суперклассах
- или элементы массива (для массива)
- заголовок (до 16 байт), и в нём:
- не содержащая:
- статические переменные
- методы
- другие объекты в себе
- своё имя (то есть у объекта нет имени)
Подготовка
Здесь приведены результаты оценки памяти объектов разного типа по способу из описания пакета java.lang.instrument (смотри также здесь). Эти результаты позволяют ответить на большинство поставленных выше вопросов.