java collection内存不足错误

use*_*619 1 java garbage-collection out-of-memory

我试图通过填充超过百万行来计算Arraylist和Linkedlist,并在Arraylist人口之后得到以下错误,

线程"main"中的异常java.lang.OutOfMemoryError:java.lang.Integer.valueOf(Integer.java:642)中的Java堆空间at scratch.Collectionss.main(Collectionss.java:25)

如何避免此错误,我尝试设置l1 = null但是这给了我一个错误,

public class Collectionss {
    public static void main(String[] args){
        // 
        long starttime = System.currentTimeMillis();
        List<Integer> l1 = new ArrayList<Integer>();
        for (int i = 1; i <= 10000000; i++){
            l1.add(i);
        }
        System.out.println(l1.size());

        long endtime = System.currentTimeMillis();

        System.out.println(endtime - starttime);

        //
        long starttime1 = System.currentTimeMillis();
        List<Integer> l2 = new LinkedList<Integer>();
        for (int i = 1; i <= 10000000; i++){
            l2.add(i);
        }
        System.out.println(l2.size());

        long endtime1 = System.currentTimeMillis();

        System.out.println(endtime1 - starttime1);

    }

}
Run Code Online (Sandbox Code Playgroud)

Pet*_*rey 6

你应该在不同的方法中运行这些测试,因为第一个循环的优化会干扰第二个循环的优化,即第二个循环可能会更慢,只是因为它是第二个.

我建议你运行两个测试至少10(或2秒)并使用具有更高分辨率的System.nanoTime().

如果你这样做但仍然内存不足,我建议你增加最大内存大小.如果您运行的是32位窗口,则默认值非常低.您可以-Xmx1g在命令行上增加它


如果您执行以下操作,您可以看到GC具有最大的影响,这并不奇怪,因为问题大多产生垃圾

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class Collectionss {

    public static final int TO_ADD = 10000000;

    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            long timeAL = timeAddToArrayList();
            long timeLL = timeAddsToLinkedList();
            System.out.printf("Time to add %,d Integer to ArrayList %.3f sec, LinkedList %.3f%n",
                    TO_ADD, timeAL / 1e9, timeLL / 1e9);
        }
    }

    private static long timeAddToArrayList() {
        long starttime = System.nanoTime();
        List<Integer> l1 = new ArrayList<Integer>();
        for (int i = 1; i <= TO_ADD; i++) {
            l1.add(i);
        }
        assert TO_ADD == l1.size();

        return System.nanoTime() - starttime;
    }

    private static long timeAddsToLinkedList() {
        long starttime = System.nanoTime();
        List<Integer> l2 = new LinkedList<Integer>();
        for (int i = 1; i <= TO_ADD; i++) {
            l2.add(i);
        }
        assert TO_ADD == l2.size();

        return System.nanoTime() - starttime;
    }
}
Run Code Online (Sandbox Code Playgroud)

版画

Time to add 10,000,000 Integer to ArrayList 0.238 sec, LinkedList 1.326
Time to add 10,000,000 Integer to ArrayList 1.193 sec, LinkedList 0.971
Time to add 10,000,000 Integer to ArrayList 0.841 sec, LinkedList 0.048
Time to add 10,000,000 Integer to ArrayList 0.349 sec, LinkedList 1.128
Time to add 10,000,000 Integer to ArrayList 0.064 sec, LinkedList 0.048
Run Code Online (Sandbox Code Playgroud)

但是,在每次测试之前添加System.gc()并获得

Time to add 10,000,000 Integer to ArrayList 0.241 sec, LinkedList 2.130
Time to add 10,000,000 Integer to ArrayList 0.070 sec, LinkedList 0.072
Time to add 10,000,000 Integer to ArrayList 0.067 sec, LinkedList 0.053
Time to add 10,000,000 Integer to ArrayList 0.069 sec, LinkedList 0.048
Time to add 10,000,000 Integer to ArrayList 0.065 sec, LinkedList 0.051
Run Code Online (Sandbox Code Playgroud)