Java Evenings в Cogniance


Побывал сегодня на Java Evenings в Cogniance. Понравилось. В голове всё перемешалось, но всё равно отпишусь.

Первым выступил Дмитирий Думанский с полезным и интересным докладом «Размер объектов в Java».
Для себя вынес следующее:

  • «Аппаратно» (т.е. не математично-алгоритмично) оптимизировать мы можем: память, процессор, ввод/вывод, блокировки.
  • Java прожорлива по памяти, приложения на джаве как правило отъедают не менее 10% всей памяти. И именно её и нужно оптимизировать в первую очередь.
  • Память сжирают: утечки, много данных и большие данные (? я разницу понял только интуитивно и забыл переспросить).
  • Даже более менее адекватно написанное приложение может вполне поймать неадекватный OutOfMemoryException
  • Оверхед на память способен довести бородатого сишника до инфаркта.

А теперь в цифрах.
У каждого объекта есть заголовок который всегда занимает 8 байт, из которых 4 байта это обязательный хешкод а остальные четыре отданы под другие ништяки, вроде Type Pointer.
Все поля выравниваются до double word, в итоге даже просто byte поле отъест 8 (ВОСЕМЬ!) байт. Однобитный примитивный булен тоже, но уже не факт, ибо его размер вообще не специфицирован плюс JVM их агрессивно оптимизирует.
Отсюда следует, что размеры все объектов всегда кратны 8ми. Можно этим затроллить синьора на собеседовании 😉

Объектные обвёртки примитивных типов — крайне плохая идея с точки зрения памяти. Зато их проще всего оптимизировать.
Если у вас есть not null поле

@NotNull
Long id;

то можно абсолютно безболезненно его сделать примитивным

@NotNull
long id;

Дальше все ахнули узнав что строка из трёх букв съест 72 байта. Поэтому ещё одной из популярных оптимизаций является отказ от строк в качестве ключей во всяких там Map.
Пустой хешсет занимает около 200 байт. Хешсет из Guava уже два кибибайта.

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

Дальше больше, 64хбитная JVM расходует памяти на заголовки почти в два раза 32битной.
В итоге при переходе на 64битный JVM у вас вдруг откуда не возьмись… OutOfMemoryException.

Закончил Дмитрий предостережением от преждевременной оптимизации.

Вывод: Однозначно нужно изучить модель памяти в Java, даже если вам кажется это лишним.

UPD
Дмитрий Думанский отметил множество технических неточностей в моём отчёте и любезно предоставил презентацию и статью на хабре. Настоятельно рекомендую.

Затем Андрей Гусев взбодрил всех докладом «Funny Java» на половину состоявшим из классических задачек SCJP и Java Puzzlers (ссылка для копимистов).
В очередной раз поймал себя на мысли сколько неочевидного можно встретить и как легко попасть на очевидном.

Выводы: 1) Нужно сертифицироваться, во время подготовки машинально запомнишь такие приколы. 2) Не экономьте на IDE, и включите все инспекции, а там как поймёте для чего они, то если что отключите. Лучше перестараться, чем недоглядеть.

Последним выступил Дмитирий Пекарь с рассказом про Hazelcast.
Это был не сколько доклад, а сколько формат беседы и обменом опыта.
Для себя вынес: Легко подключаемый и конфигурируемый джарник, который предоставляет деценетрализированое In-Memory хранилище (O_o синхронное?), с внятным API и возможностью писать запросы на чём-то похожем на SQL. Я правда не очень понял чем он от Касандры отличается.

Потом было пица и пивко, что было кстати очень кстати.

Спасибо огромное докладчикам, организаторам, всем присутствующим и компании Cogniance растящей таких специалистов!

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s