java集合内存不足错误

标签 java garbage-collection out-of-memory

<分区>

我试图通过填充超过百万行来为 Arraylist 和 Linkedlist 计时,并在 Arraylist 填充后出现以下错误,

线程“main”中的异常 java.lang.OutOfMemoryError:Java 堆空间 在 java.lang.Integer.valueOf(Integer.java:642) 在 scratch.Collectionss.main(Collections.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);

    }

}

最佳答案

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

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

如果您执行此操作但内存仍然不足,我建议您增加最大内存大小。如果您运行的是 32 位 Windows,则默认值非常低。您可以在命令行上使用 -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;
    }
}

打印

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

但是在每次测试之前添加 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

关于java集合内存不足错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18723028/

相关文章:

java - 如何使用 NetBeans 在 Java 程序中包含文本文件

java - 有没有办法避免在横向上使用全屏搜索 View /键盘?

JavaFX - 停止表列与父级一起调整大小

Python 线程垃圾回收

.net - 如何允许在事件处理程序连接到 COM 对象的对象上进行垃圾回收

没有 gc 的 Java - io

java - 字符串的 boolean 比较

java - 如何通过 JMX 检测 OutOfMemoryError

java - 在 Java 中,有没有办法随机化一个太大而无法放入内存的文件?

java - 垃圾收集似乎在 Java 中不起作用