Java内存使用 - 原语

时间:2013-08-16 16:27:56

标签: java algorithm memory primitive

Algorithms 4th edition

引用以下内容

“例如,如果你的计算机上有1GB的内存(10亿字节),你一次就不能在内存中容纳超过3200万个int值或1600万个double值。”

int - 4个字节

32百万x 4 = 1.28亿字节

帮助我理解,为什么我们不能容纳3200万个int值,上面的128万字节大约是1GB或10亿字节的总内存消耗的1/10。

2 个答案:

答案 0 :(得分:4)

这取决于您组织数据的方式。在Java中,每个对象都有开销,这与JVM有关,但通常为8或16个字节。因此,如果将每个int值包装到一个对象(如Integer)中,则可能超过1GB。但是,如果将其分配为int[]数组,那么它应该很容易适合1GB。

并且,这与问题没有严格关系,但反映@ Anony-Mousse的评论,有JVMs for microcontrollers,我很确定这些JVM中的对象大小低于8个字节(尽管我没有找不到确切的数据。

答案 1 :(得分:2)

正如@Katona所说,这取决于你是否存储 primitve 整数或包裹整数。

int需要4个字节,double需要8个字节,但通常的Hotspot VM中的IntegerDouble个对象需要16个字节。

假设您将它们存储为Integer[],每个对象引用需要4个额外字节。

现在,如果您使用例如TreeSetHashSet事情变得更糟。这些也将需要一个Entry对象,该对象(在32位上,或使用压缩指针)应该为内部存储器中的对象引用添加另外16个字节,加上4个(64位没有压缩指针)字节。

因此,如果您将整数存储在TreeSet<Integer>中,那么只有2800万个整数和1 GB RAM可能会耗尽内存。

另一方面是显然并非所有内存都可用于存储对象数据。 Java还需要用于内务处理的内存,类加载器和一些内存只是在段边界“浪费”,并为将来的使用做好准备。假设,例如只有50%-66%可供您“自己”处置,并且您有对象开销,上面的数字可能是正确的,并且碰巧在练习中引起问题,而不是理论。