引用算法第4版中的下列内容
例如,如果计算机上有1GB内存(10亿字节),则不能同时容纳超过3200万int值或1600万个双值内存。
INT-4字节
3 200万x4=1.28亿字节
帮助我理解,为什么我们不能适应3200万int值,上面的1.28亿字节大约是1GB或10亿字节的内存消耗总量的1/10。
发布于 2013-08-16 16:34:51
这取决于您如何组织数据。在Java中,每个对象都有一个开销,这是JVM依赖的,但通常是8或16个字节。因此,如果将每个int值包装到一个对象(如Integer)中,则可能超过1GB。但是,如果您将它作为一个int[]数组分配,那么它应该可以轻松地放入1GB中。
而且,这与这个问题没有严格的关系,但是反映到@Anony-Mousse的评论中,有微控制器用JVM,我很确定那些JVM中的对象大小在8个字节以下(尽管我没有找到确切的数据)。
发布于 2013-08-16 18:26:37
正如@Katona所说,这取决于您是存储原始整数还是包装整数。
一个int需要4个字节,一个double需要8个字节,但是通常Hotspot VM中的Integer和Double对象都需要16个字节。
假设将它们存储为Integer[],则每个对象引用需要4个额外字节。
现在,如果您使用例如TreeSet或HashSet,情况就会严重恶化。这些还将重新定义一个Entry对象,该对象(在32位上,或者使用压缩指针)应该再添加16个字节,再加上4个字节(在64位上没有压缩指针)字节,用于内部存储中的对象引用。
因此,如果您将整数存储在一个TreeSet<Integer>中,那么很可能内存不足,只有2800万个整数和1GB内存。
另一个方面是,显然不是所有的内存都可用于存储对象数据。Java还需要内存来管理事务,类加载器和一些内存只是在段边框被“浪费”,并为将来的使用做好了准备。假设只有50%-66%可供您“自己”处理,并且您有对象开销,上述数字可能是正确的,并碰巧在实践中引起问题,而不是理论。
https://stackoverflow.com/questions/18278010
复制相似问题