首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >短内存分配与整数内存分配

短内存分配与整数内存分配
EN

Stack Overflow用户
提问于 2016-10-26 08:46:06
回答 2查看 172关注 0票数 1

更新

我要把非常大的数据结构Map<Integer, Integer[]>保存在内存中,这样就有可能使用OutOfMemory。Map<Integer, Short[]>会降低风险吗?还是没有必要使用Short[]而不是Integer[]__?

问题

我想知道为什么两个大小相同的数组:Short[]Integer[]占用的内存数量相同?下面是代码的输出:

代码语言:javascript
复制
Output:
Short primitives array size: 120 b
Int primitives array size: 216 b // It's ok, int takes 4 bytes, short takes 2 bytes
Short array size: 800 b
Int array size: 800 b // WHY?? Why Int[] takes the same amount of memory as Short[]
Short set size: 2960 b //There is no sense to use Set<Short> instead of Set<Integer> in Java, right?
Int set size: 2960 b

MemoryTest.java

代码语言:javascript
复制
private final static Integer MAX_VALUE = 1000;
private final static Integer AVERAGE_COLLECTION_LENGTH = 50;
private final static Random rand = new Random();

public static void main(String[] args) {
    Short[] shortArray = genRandomArrayOfShort();
    Integer[] intArray = genRandomArrayOfInt();
    Set<Short> shortSet = genRandomSetOfShort();
    Set<Integer> intSet = genRandomSetOfInt();
    System.out.println("Short primitives array size: " + RamUsageEstimator.sizeOfAll(new short[AVERAGE_COLLECTION_LENGTH]) + " b");
    System.out.println("Int primitives array size: " + RamUsageEstimator.sizeOfAll(new int[AVERAGE_COLLECTION_LENGTH]) + " b");
    System.out.println("Short array size: " +  RamUsageEstimator.sizeOfAll(shortArray) + " b");
    System.out.println("Int array size: " + RamUsageEstimator.sizeOfAll(intArray) + " b");
    System.out.println("Short set size: " +  RamUsageEstimator.sizeOfAll(shortSet) + " b");
    System.out.println("Int set size: " +  RamUsageEstimator.sizeOfAll(intSet) + " b");
}

private static Set<Short> genRandomSetOfShort() {
    return Sets.newHashSet(genRandomArrayOfShort());
}

private static Set<Integer> genRandomSetOfInt() {
    return Sets.newHashSet(genRandomArrayOfInt());
}

private static Short[] genRandomArrayOfShort() {
    Short[] array = new Short[AVERAGE_COLLECTION_LENGTH];
    for (int i = 0; i < AVERAGE_COLLECTION_LENGTH; i++) {
        array[i] = (short) rand.nextInt(MAX_VALUE);
    }
    return array;
}

private static Integer[] genRandomArrayOfInt() {
    Integer[] array = new Integer[AVERAGE_COLLECTION_LENGTH];
    for (int i = 0; i < AVERAGE_COLLECTION_LENGTH; i++) {
        array[i] = rand.nextInt(MAX_VALUE);
    }
    return array;
}

可以将包括到您的项目中的地方:

代码语言:javascript
复制
<dependency>
    <groupId>com.carrotsearch</groupId>
    <artifactId>java-sizeof</artifactId>
    <version>0.0.5</version>
</dependency>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-26 08:52:11

因为ShortInteger都是对象,而不是原语类型。对象类型实际上只是32/64位大小的堆栈引用,指向内存堆中的实际值。如果您想看到实际大小的差异,请使用shortint。示例:

代码语言:javascript
复制
short[] shortArray;
int[] intArray
票数 3
EN

Stack Overflow用户

发布于 2016-10-26 08:50:22

在Java中,所有对象引用都具有相同的大小。您看到的是保存对实际对象的引用所需的内存量。

假设这两个数组都填充了null。它们不是都需要同样的尺寸吗?

更新:为了减少内存使用,您应该使用原语数组,而不是包装器类型。因此,使用标准的JDK类,最好的方法可能是使用Map<Integer, short[]>

您可以了解如何在此博客帖子中计算数据的内存使用情况。

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

https://stackoverflow.com/questions/40257657

复制
相关文章

相似问题

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