Как стать автором
Обновить

Комментарии 6

Конечно забавно исследование, но помойму проще теоретически оценить размер объекта
Было бы более полно, если был бы пример с наследованием, — у родителя 0/пара полей и у наследника пара полей…
святая простота) оценить можно, разбежка с фактическим значением может оказаться в 5-10 раз, ну и толку от такой оценки тогда? для этого и сделали jol, потому что есть вещи о которых знает условно говоря только Шипилёв
Для всех приведенных примеров, я без проблем могу оценить теоретически,
и тут уже точно не надо быть Шипилевым

Тут наверно вопрос целесообразности. Если я пишу интерпрайз приложуху, врятли я буду дергать классы в свой пет проект, чтобы оценить их размер.

Да, я конечно понимаю, что например препроцессор анотаций может в класс запихнуть что угодно. Но как правило это не важно. Гораздо важнее оценивать порядок. Займет ли у тебя что-то 1 мегабайт или 10 мегабайт
{class S {         } class C extends S {long a,b;} mem("0+2", new C());} // 0+2: 32
{class S {long a,b;} class C extends S {long a,b;} mem("2+2", new C());} // 2+2: 48
Здесь, как и с бенчмарками, работает правило: измеренные значения в отсутствие теоретического обоснования не говорят ни о чём. Более того, цифры могут врать, и здесь как раз такой случай.

Как иначе объяснить, что объекты Class (кроме примитивных) занимали так много в JDK 8, но внезапно уменьшились в разы в JDK 9+? А дело в том, что метод, которым вы пользовались для измерения, злостно врал в JDK 8, а в JDK 9 ошибку исправили.
указывает, что сначала был вызван метод premain класса-агента, а затем — метод main исполняемого класса.

Хозяйке на заметку: если не хочется возиться с -javaagent и сложным запуском, то при помощи библиотеки https://github.com/electronicarts/ea-agent-loader можно агента подключать прямо из main(), но когда необходимые классы еще не загружены. Библиотека использует специальный JMX интерфейс OpenJDK.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории