首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java内存使用-原语

Java内存使用-原语
EN

Stack Overflow用户
提问于 2013-08-16 16:27:56
回答 2查看 995关注 0票数 5

引用算法第4版中的下列内容

例如,如果计算机上有1GB内存(10亿字节),则不能同时容纳超过3200万int值或1600万个双值内存。

INT-4字节

3 200万x4=1.28亿字节

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-16 16:34:51

这取决于您如何组织数据。在Java中,每个对象都有一个开销,这是JVM依赖的,但通常是8或16个字节。因此,如果将每个int值包装到一个对象(如Integer)中,则可能超过1GB。但是,如果您将它作为一个int[]数组分配,那么它应该可以轻松地放入1GB中。

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

票数 4
EN

Stack Overflow用户

发布于 2013-08-16 18:26:37

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

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

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

现在,如果您使用例如TreeSetHashSet,情况就会严重恶化。这些还将重新定义一个Entry对象,该对象(在32位上,或者使用压缩指针)应该再添加16个字节,再加上4个字节(在64位上没有压缩指针)字节,用于内部存储中的对象引用。

因此,如果您将整数存储在一个TreeSet<Integer>中,那么很可能内存不足,只有2800万个整数和1GB内存。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18278010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档