2015-06-02 21 views
6

Wir haben eine Klasse mit vielen Instanzen und laufen in Speicherprobleme. Daher versuchen wir, die Speicheranforderungen dieser Klasse zu reduzieren. Eine Idee wäre die folgende.Java-Micro-Optimierung: Kombinieren Menge boolescher Instanz Variablen zu Bit-Vektor basierend auf Int

Die Klasse hat viele boolesche Instanzvariablen, von denen jede in einer naiven Implementierung ein Wort aufnehmen würde. Man könnte sich vorstellen, sie zu einem Mini-Bit-Vektor zu kombinieren, der in einem Int gespeichert ist, so dass ihre kombinierte Speicheranforderung ein Wort wäre.

Aber ich würde vermuten, dass die Java VM diese Optimierung sowieso macht, so dass die Durchführung von Hand würde keine zusätzlichen Einsparungen erhalten. Recht?

+0

Bitte präzisieren Sie auf * hohe Anzahl von Instanzen * - befinden sie sich alle im Speicher auf einmal oder machen Sie nur viele (und verwerfen), und wie viele reden wir über Tausende? Meeelions ?? Bitte präzisieren Sie * viele boolesche Instanzvariablen * - wie viele? – OldCurmudgeon

Antwort

4

A boolean verwendet 1-Byte-Speicher (auf Hotspot). Sie könnten Alternativen verwenden:

  • ein BitSet: uses etwa 1 Bit pro boolean + die Overhead der Klasse selbst, der Verweis auf die BitSet, der Verweis auf die long[] im BitSet und der ungenutzten Raum in den long[], dh etwa 20 Bytes
  • ein int wobei jedes Bit eine boolesche 32 booleans zum speichern in 4 Bytes ist
  • lang, wobei jedes Bit eine boolesche 64 booleans zum speichern in 8 Bytes

Die JVM ist unwahrscheinlich um diese Optimierung zu machen Sie (Hotspot 8 nicht).

+0

Zum Speichern von Speicher mit BitSet sind also mindestens 20x8 = 160 Bit erforderlich. Das sind viele Bits für eine einzelne Klasse. Nun, dann komprimiere ich sie mit der Hand –

+1

@UlrichScholz Es hängt davon ab, wie viele Booleans Sie haben - wenn Sie weniger als 64 von ihnen haben, dann Int und Long sind bei weitem die besten Optionen - aber wenn Sie Tausende von Booleans haben, der Aufwand eines BitSets ist ein viel kleinerer Prozentsatz des gesamten von den Booleans verwendeten Speichers. – assylias

5

Die JVM wird das nicht für Sie tun. Die tatsächliche Speichergröße, die pro Booleschen Wert verwendet wird, liegt normalerweise bei einem Byte, ist aber im Allgemeinen JVM-abhängig.

Wenn Sie so viele boolesche Variablen haben, sollten Sie darüber nachdenken, ein BitSet zu verwenden, das Bits für die Darstellung boolescher Werte verwendet.

Siehe Javadoc- Referenz:

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