Pull to refresh

Comments 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.

Sign up to leave a comment.

Articles