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中的Integer
和Double
对象都需要16个字节。
假设您将它们存储为Integer[]
,每个对象引用需要4个额外的字节。
现在,如果您使用例如TreeSet
或HashSet
事情会变得更糟。 这些也将需要一个Entry
对象,该对象(在32位上,或使用压缩指针)应该为内部存储器中的对象引用添加另外16个字节加上4个(64位没有压缩指针)字节。
因此,如果要在TreeSet
中存储整数,那么内存可能只有2800万个整数和1 GB RAM。
另一方面是显然并非所有内存都可用于存储对象数据。 Java还需要用于内务处理的内存,类加载器和一些内存只是在段边界“浪费”,并为将来的使用做好准备。 假设例如只有50%-66%可供您“自己”处置并且您有对象开销,则上述数字可能是正确的,并且恰好在实践中引起问题,而不是理论问题。