1

如何计算 Java TreeMap 需要多少内存来处理每个映射?

我正在用 128 个线程进行实验,每个线程在自己的数组中转储 2^17 个 long。然后将所有这些 2^24 个 long 映射到 ints ( TreeMap<Long,Integer>),每个数组引用在移动到下一个之前都被清空。

键+值的大小应为 128+64 MB。我很惊讶在分配给此 VM 的 512MB 映射期间出现 OutOfMemoryError。

4

3 回答 3

4

您似乎假设映射中的 Long、Integer 键/值对仅占用 12 个字节的内存。那是错的。

即使您从原始长数组复制,当您将它们用作映射键和值时,自动装箱也会自动创建 Long 和 Integer 对象实例作为原始值的包装器。对象实例的内存要求是特定于 VM 实现的,但我认为 Sun 的 VM 位于这些对象的 32-48 字节范围内,64 位 VM 中的实例稍大一些。此外,映射需要为每个键/值对附加对象实例来管理内部数据结构。

于 2009-12-09T23:37:05.400 回答
1

每个 Long 至少 16 字节,每个 Integer 至少12 16 字节,由于 8 字节对象开销和 8 字节对齐。在 32 位机器上,每个节点至少有24个 32 字节(对象头、键、值、两个子节点和用于平衡的标志)。这意味着至少 2^24 * (12+24+16) = 832MB

编辑:看起来对象是 8 字节对齐的,所以将 Integer 提高到 16 字节。此外,一个树节点可能还有另一个用于平衡树的字段,因此为它计算 32 个字节。这使我们至少达到 1024MB

于 2009-12-09T23:40:01.203 回答
0

显然,从这个Tree Map 4 Docs 树的默认大小是 64M。如果超过了它会报告 OutOfMemoryError。如果您未指定最大尺寸,则默认为该尺寸。

希望对鲍勃有所帮助

编辑:忽略这个。都是错的。

于 2009-12-09T23:37:48.010 回答