Java 树映射内存使用

Java 树映射内存使用,java,binary-tree,treemap,Java,Binary Tree,Treemap,如何计算Java树映射需要多少内存来处理每个映射 我正在用128个线程做一个实验,每个线程在自己的数组中转储2^17个长线程。 然后将所有这2^24个长度映射到整数(TreeMap),每个数组引用在移动到下一个之前都为空 键+值的大小应为128+64 MB。在映射过程中,我很惊讶地发现分配给这个VM的内存为512MB。您似乎认为映射中的长整数键/值对只占用12字节的内存。这是错误的 即使从基元长数组复制,当您将基元值用作映射键和值时,自动装箱也会自动创建长对象实例和整数对象实例作为基元值的包装器

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

我正在用128个线程做一个实验,每个线程在自己的数组中转储2^17个长线程。 然后将所有这2^24个长度映射到整数(
TreeMap
),每个数组引用在移动到下一个之前都为空


键+值的大小应为128+64 MB。在映射过程中,我很惊讶地发现分配给这个VM的内存为512MB。您似乎认为映射中的长整数键/值对只占用12字节的内存。这是错误的


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

您似乎假设映射中的长整型键/值对只占用12字节的内存。这是错误的

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

由此看来,树的默认大小是64M。如果超过此值,它将报告OutOfMemoryError。如果不指定最大大小,它将默认为该大小

希望有帮助 鲍勃

编辑:忽略这个。这完全错了。

显然,从这个角度看,树的默认大小是64米。如果超过此值,它将报告OutOfMemoryError。如果不指定最大大小,它将默认为该大小

希望有帮助 鲍勃


编辑:忽略这个。这完全是错误的。

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


编辑:看起来对象是8字节对齐的,所以将整数增加到16字节。此外,树节点可能还有另一个字段用于平衡树,因此请为其计算32个字节。这使我们的最小容量达到了1024MB,由于8字节的对象开销和8字节的对齐方式,每个长度至少为16字节,每个整数至少为12 16字节。在32位机器上,每个节点至少有24 32字节(对象头、键、值、两个子节点和平衡标志)。这意味着至少有2^24*(12+24+16)=832MB


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

你在计算树本身需要多少空间吗?你在计算树本身需要多少空间吗?我想他说的是
java.util.TreeMap
,而不是第三方的“TreeMap”类。我想他说的是
java.util.TreeMap
,不是一些第三方的“Treemap”类。所以总共32+16+16=64字节的节点+键(长)+值(整数),回答得很好!所以总共32+16+16=64字节为节点+键(长)+值(整数),回答得很好!谢谢你指出了我在我的问题中没有考虑到的拳击问题。但是,32-48字节似乎不正确。如果每个Long和Integer占用32个字节,而映射(节点)占用32个字节(请参见280Z28的答案),则相当于2^24*(32+32+32)=1536MB。我们已经升级了RAM,现在可以用1280MB成功地执行此操作。我不是100%确定内存使用情况,但您应该在运行时环境中测试它。在Sun的JDK1.6.0_10中,整数和长实例在32位VM中分别占20字节和32字节。在TrimAP中,长/整数键/值对在32位VM中占用64个字节,在64位VM中占用112个字节。谢谢指出了我在我的问题中没有考虑的拳击问题。但是,32-48字节似乎不正确。如果每个Long和Integer占用32个字节,而映射(节点)占用32个字节(请参见280Z28的答案),则相当于2^24*(32+32+32)=1536MB。我们已经升级了RAM,现在可以用1280MB成功地执行此操作。我不是100%确定内存使用情况,但您应该在运行时环境中测试它。在Sun的JDK1.6.0_10中,整数和长实例在32位VM中分别占20字节和32字节。在树映射中,长/整数键/值对在32位VM中占用64字节,在64位VM中占用112字节。