如何计算Java TreeMap处理每个映射需要多少内存?
我正在用128个线程进行实验,每个线程在自己的数组中倾倒2 ^ 17个长整数。
然后将所有这些2 ^ 24个长整数映射到整数(TreeMap<Long,Integer>
),每个数组引用在移动到下一个之前都会为空。
键+值应该达到128 + 64 MB。我很惊讶在映射期间获得了OutOfMemoryError,并为该VM分配了512MB。
答案 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。如果您没有指定最大尺寸,则默认为。
希望有所帮助 鲍勃
编辑:忽略这一点。这一切都错了。