Java内存使用 – 原语

从Algorithms第4版引用以下内容

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

int – 4个字节

3200万x 4 = 1.28亿字节

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

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

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

正如@Katona所说,这取决于你是存储原始整数还是包装整数。

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

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

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

因此,如果要在TreeSet中存储整数,那么内存可能只有2800万个整数和1 GB RAM。

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