В реализациях примитивной карты (fastutil, koloboke, gs, hppc) значения реализованы как отдельный массив byte[]
, поэтому они фактически принимают только 1 байт. Если byte
является полем другого Java-объекта на куче (значение карты), размер объекта округляется до 8-байтовой границы, поэтому одно поле byte
может «взять» 8 байтов. Но чаще он «принимает» 0 байтов, потому что поле помещается в уже существующие отверстия выравнивания.
Для карты хроники значение может иметь размер 1 байт. (И даже 0 байтов, вот как ChronicleSet
в настоящее время внедрен - ChronicleMap
с 0-байтовыми значениями фиктивных данных.) Это справедливо для всех версий хроники (2, 3).
Редактировать - ответить на комментарий.
Если у вас есть структура с постоянным размером e. г. 6 байт поля, самый простой и эффективный способ - использовать данные mechanishm поколения значение:
interface MyValue {
byte getA(); void setA(byte a);
byte getB(); void setB(byte b);
byte getC(); void setC(byte c);
byte getD(); void setD(byte d);
byte getE(); void setE(byte e);
byte getF(); void setF(byte f);
}
map = ChronicleMapBuilder.of(Key.class, MyValue.class).entries(1000).create();
// Chronicle Map 2 syntax
MyValue value = DataValueClasses.newDirectReference(MyValue.class);
try (Closeable handle = map.getUsingLocked(key, value)) {
// access the value here
System.out.println(value);
}
// Chronicle Map 3 syntax
try (ExternalMapQueryContext<Key, MyValue, ?> q = map.queryContext(key)) {
// if not sure the key is present in the map, check q.entry() != null
MyValue value = q.entry().value().get();
// access the value here
System.out.println(value);
}
Это займет ровно 6 байт на значение.
Я предполагаю, что нет байт <-> бит путаница выше. В этом случае Object с 6 полями типа «byte» будет потреблять (в худшем случае) 8 байтов памяти offheap (говоря о ChronicleMap здесь). Верный? –
@ KostyaKulagin см. Ответ edit – leventov
Спасибо, Роман, единственное замешательство, которое у меня есть, это фраза: _indeed, размер объекта округлен до 8-байтовой границы, поэтому однобайтовое поле может «взять» 8 байтов. В этом случае он не был округлен до 8 байтов? –