Это привлекло мое внимание и внимание со вчерашнего дня. Я пытаюсь хранить биты в Java и попадать в память.Есть ли все-таки, чтобы хранить бит в Java без накладных расходов памяти?
Мой первый вопрос, касающийся же What is size of my Bitset?
На основе ответов я посмотрел на другие ссылки и нашли Memory Usage руководство.
Затем я посмотрел на BitSet
исходный код, который выглядит как
public class BitSet implements Cloneable, java.io.Serializable {
/*
* BitSets are packed into arrays of "words." Currently a word is
* a long, which consists of 64 bits, requiring 6 address bits.
* The choice of word size is determined purely by performance concerns.
*/
private final static int ADDRESS_BITS_PER_WORD = 6;
private final static int BITS_PER_WORD = 1 << ADDRESS_BITS_PER_WORD;
private final static int BIT_INDEX_MASK = BITS_PER_WORD - 1;
/* Used to shift left or right for a partial word mask */
private static final long WORD_MASK = 0xffffffffffffffffL;
/**
* @serialField bits long[]
*
* The bits in this BitSet. The ith bit is stored in bits[i/64] at
* bit position i % 64 (where bit position 0 refers to the least
* significant bit and 63 refers to the most significant bit).
*/
private static final ObjectStreamField[] serialPersistentFields = {
new ObjectStreamField("bits", long[].class),
};
/**
* The internal field corresponding to the serialField "bits".
*/
private long[] words;
/**
* The number of words in the logical size of this BitSet.
*/
private transient int wordsInUse = 0;
/**
* Whether the size of "words" is user-specified. If so, we assume
* the user knows what he's doing and try harder to preserve it.
*/
private transient boolean sizeIsSticky = false;
/* use serialVersionUID from JDK 1.0.2 for interoperability */
private static final long serialVersionUID = 7997698588986878753L;
/**
* Given a bit index, return word index containing it.
*/
private static int wordIndex(int bitIndex) {
return bitIndex >> ADDRESS_BITS_PER_WORD;
}
.....
}
В соответствии с расчетом, основанным на Memory Guide
, это то, что я вычислил
8 Bytes: housekeeping space
12 Bytes: 3 ints
8 Bytes: long
12 Bytes: long[]
4 Bytes: transient int // does it count?
1 Byte : transient boolean
3 Bytes: padding
Это подводит к 45 + 3 bytes (padding to reach multiple of 8)
Это означает пустой BitSet
сам резерв 48 bytes
.
Но мое требование состояло в том, чтобы хранить биты, что мне не хватает? Какие у меня варианты?
Спасибо большое
UPDATE
Мое требование, что я хочу, чтобы хранить в общей сложности 64 bits
в двух отдельных областях
class MyClass{
BitSet timeStamp
BitSet id
}
и я хочу, чтобы хранить миллионы MyClass
объектов в памяти
Сколько бит нужно хранить? Если миллионы, то накладные расходы 48 байт пренебрежимо мал против фактических сохраненных бит. Если бы только несколько, вы могли бы просто использовать int или длинный или несколько longs или long []. – assylias
Вы забыли указать, сколько бит вы хотите сохранить. Самый дешевый способ хранения «бит» находится внутри примитивного типа, например. int = 32 бит. То, что вы воспринимаете как много накладных расходов в BitSet, не составляет многого, если вам нужно хранить много бит (тысячи или более). – Durandal
Просто обновите требование. спасибо, что упомянул об этом – daydreamer