“例如,如果你的计算机上有1GB的内存(10亿字节),你一次就不能在内存中容纳超过3200万个int值或1600万个double值。”
int - 4个字节
32百万x 4 = 1.28亿字节
帮助我理解,为什么我们不能容纳3200万个int值,上面的128万字节大约是1GB或10亿字节的总内存消耗的1/10。
答案 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中的Integer
和Double
个对象需要16个字节。
假设您将它们存储为Integer[]
,每个对象引用需要4个额外字节。
现在,如果您使用例如TreeSet
或HashSet
事情变得更糟。这些也将需要一个Entry
对象,该对象(在32位上,或使用压缩指针)应该为内部存储器中的对象引用添加另外16个字节,加上4个(64位没有压缩指针)字节。
因此,如果您将整数存储在TreeSet<Integer>
中,那么只有2800万个整数和1 GB RAM可能会耗尽内存。
另一方面是显然并非所有内存都可用于存储对象数据。 Java还需要用于内务处理的内存,类加载器和一些内存只是在段边界“浪费”,并为将来的使用做好准备。假设,例如只有50%-66%可供您“自己”处置,并且您有对象开销,上面的数字可能是正确的,并且碰巧在练习中引起问题,而不是理论。