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 对象的内存占用产生影响。您可以使用以下工具检查对象内存占用情况:
我正在创建一个 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 对象的内存占用产生影响。您可以使用以下工具检查对象内存占用情况: