TreeMap内存使用情况

时间:2009-12-09 23:26:16

标签: java binary-tree treemap

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

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

键+值应该达到128 + 64 MB。我很惊讶在映射期间获得了OutOfMemoryError,并为该VM分配了512MB。

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

从这个Tree Map 4 Docs看来,树的默认大小是64M。如果超出此范围,它将报告OutOfMemoryError。如果您没有指定最大尺寸,则默认为。

希望有所帮助 鲍勃

编辑:忽略这一点。这一切都错了。