joda ArrayIntList(5000000)vs int [5000000]内存消耗

时间:2013-11-15 18:41:02

标签: java collections ram

我(使用netbeans探测器)比较了一些java集合,发现ArrayIntList比平面阵列占用更多内存,即使你使用相同的初始容量创建它也是如此。根据其源代码,它只是在里面创建相同的数组。所以我不明白。

您可以在下面看到源代码。

enter image description here

class ProfileFlatArray {

    public static void main(String[] args) throws InterruptedException {

        final int LEN = 5000000;
        int[] array = new int[LEN];
        Random rand = new Random();

        for (int i = 0; i < LEN; i++) {
            array[i] = rand.nextInt();
        }

        Thread.sleep(2000);

        for (int i = LEN - 1; i > LEN / 2; i--) {
            array[i] = 0;
        }

        Thread.sleep(5000);

        System.gc();

        Thread.sleep(2000);

        System.out.print(array[rand.nextInt(LEN / 2 - 2)]);

    }
}

Joda:

class ProfileArrayIntList {

    public static void main(String[] args) throws InterruptedException {

        final int LEN = 5000000;
        ArrayIntList array = new ArrayIntList(LEN);

        Random rand = new Random();

        for (int i = 0; i < LEN; i++) {
            array.add(i, rand.nextInt());
        }

        Thread.sleep(2000);

        for (int i = LEN - 1; i > LEN / 2; i--) {
            array.removeIntAt(i);
        }
        array.optimize();

        Thread.sleep(5000);

        System.gc();

        Thread.sleep(2000);

        System.out.print(array.get(rand.nextInt(LEN / 2 - 2)));

    }
}

1 个答案:

答案 0 :(得分:1)

这是电话

的结果
array.optimize();

通过首先分配较小尺寸的数组来压缩新数组。这导致内存凸起。然后旧的数组被GC编辑,这导致内存降低。所以在一天结束时optimize()释放了一半的已用内存。