Java 减小对象的大小

Java reduce size of object

我正在创建一个 trie,我的应用程序会将其保存在内存中。 Trie 会有很多节点,我正在考虑如何减少 space 使用率。 因为我将使用 trie 到 DAWG 算法来减少节点数量,但据我所知这还不够。

这是一个节点class

class Node{
  char letter;
  boolean EOW; // end of word
  Node child; // first child
  Node next; // next Node on this level
}

据我所知,这个 class 的对象将有 14 个字节(2 个字节用于 char,4 个用于布尔变量,2*4 将保留用于引用)

我认为我可以按字节替换字符。这将节省 1 个字节。但是我不知道类型转换需要多少时间。这可能是一个糟糕的设计。

布尔值也需要 4 个字节,也许你知道我可以用什么来代替布尔值?

所以我需要你帮我减少节点的大小。提前致谢。

如果 letter 只占 5 位而 eow 占一个位,您可以将它们打包成一个 byte 以节省内存。

char letter = ...;
boolean eow = ...;

byte packed = (byte) ((eow ? 0b10_0000 : 0) | letter);

letter = (char) (packed & 0b1_1111);
eow = (packed & 0b10_0000) != 0;

如果你不需要更奇怪的一半UTF-16字符,你可以使用letter的最高位作为EOW标记。

例如,此处的 eoWletterA 变量具有使用 EOW 位编码的字母 'a':

char eoWletterA = 'a' + 0x8000;
char letter = (char) (eoWletterA & 0x7FFF);
boolean eow = BigInteger.valueOf(eoWletterA).testBit(15);

你的 trie 应该被正确封装。确保在将字符存储到 trie 时不会意外设置 EOW 位。

更新:请注意,从 Node 中删除 boolean 变量可能会或可能不会对 JVM 中 Node 对象的内存占用产生影响。您可以使用以下工具检查对象内存占用情况: