2015-06-02 5 views
6

Abbiamo una classe con molte istanze e si verificano problemi di memoria. Pertanto, cerchiamo di ridurre i requisiti di memoria di questa classe. Un'idea sarebbe la seguente.java micro-optimization: combinare set di variabili di istanza booleane a bit vector in base a int

La classe ha molte variabili di istanza booleane, ognuna delle quali occupa una sola parola in un'implementazione ingenua. Si potrebbe pensare di combinarli con un vettore di mini bit memorizzato in un int, in modo tale che il loro requisito di memoria combinata sia di una parola.

Ma sospetto che la Java VM stia facendo comunque questa ottimizzazione, in modo tale che eseguendola a mano non si otterrebbero ulteriori risparmi. Destra?

+0

Si prega di essere più preciso su * numero elevato di istanze * - risiedono tutti nella memoria in una volta o stai solo facendo (e scartando) molti, e di quanti ne stiamo parlando, migliaia? Meeelions ?? Si prega di essere più precisi su * molte variabili di istanza booleane * - quante? – OldCurmudgeon

risposta

4

un booleano utilizza 1 byte di memoria (su hotspot). Si potrebbe utilizzare alternative:

  • un BitSet: utilizza circa 1 bit per booleano + il sovraccarico della classe stessa, il riferimento al BitSet, il riferimento al long[] nel BitSet e lo spazio inutilizzato nel long[], cioè circa 20 byte
  • un int in cui ogni bit è un booleano di memorizzare 32 booleani a 4 byte
  • lungo cui ogni bit è un booleano memorizzare 64 booleani a 8 byte

La JVM è improbabile per fare questa ottimizzazione per tu (l'hotspot 8 non lo fa).

+0

Quindi, per risparmiare memoria utilizzando BitSet è necessario almeno 20x8 = 160 bit. Questo è un sacco di bit per una singola classe. Bene, allora li compongo a mano –

+1

@UlrichScholz Dipende da quanti booleani hai - se ne hai meno di 64, allora int e long sono di gran lunga le opzioni migliori - ma se hai migliaia di booleani, il sovraccarico di un BitSet sarà una percentuale molto più piccola della memoria totale utilizzata dai booleani. – assylias

5

La JVM non lo farà per voi. La dimensione effettiva nella memoria utilizzata per booleano è di solito intorno a un byte, ma in generale è dipendente da JVM.

Se si dispone di molte variabili booleane, è necessario pensare a utilizzare un BitSet, progettato per utilizzare bit per la rappresentazione di valori booleani.

consultare Javadoc per riferimento:

http://docs.oracle.com/javase/7/docs/api/java/util/BitSet.html

Problemi correlati