我试图通过填充超过百万行来为 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