过时的引用和内存不足错误
Obsolete reference and out of memory error
为什么 version4
方法抛出内存不足错误但 version3
方法不抛出它,我认为在这两种情况下都存在问题 "obsolete reference"?
private static void version4() {
int count = 0;
long start = System.nanoTime();
try {
List<Calendar> list = new ArrayList<>();
System.out.println(list.size());
while(true){
for (int i = 0; i < 1000; i++) {
Calendar calendar = Calendar.getInstance();
list.add(i, calendar);
}
}
} catch (Error e) {
e.printStackTrace();
}
long end = System.nanoTime();
System.out.println("count: " + count + " | time:" + (end - start)/1000000);
}
private static void version3() {
int count = 0;
long start = System.nanoTime();
try {
Calendar[] calendars = new Calendar[1000];
while(true){
for (int i = 0; i < calendars.length; i++) {
Calendar calendar = Calendar.getInstance();
calendars[i] = calendar;
}
}
} catch (Error e) {
e.printStackTrace();
}
long end = System.nanoTime();
System.out.println("count: " + count + " | time:" + (end - start)/1000000);
}
在这两种情况下,由于外部while (true)
.
,你会永远循环
但是在数组的情况下,在内部循环中,您覆盖了数组的旧值(长度为 1000)。所以内存消耗是恒定的。
在 ArrayList
的情况下,您在内部循环中添加新的 Calendar
对象。所以内存使用量不断增长:1000(第一个循环)+ 1000(第二个循环)+ ...
为什么 version4
方法抛出内存不足错误但 version3
方法不抛出它,我认为在这两种情况下都存在问题 "obsolete reference"?
private static void version4() {
int count = 0;
long start = System.nanoTime();
try {
List<Calendar> list = new ArrayList<>();
System.out.println(list.size());
while(true){
for (int i = 0; i < 1000; i++) {
Calendar calendar = Calendar.getInstance();
list.add(i, calendar);
}
}
} catch (Error e) {
e.printStackTrace();
}
long end = System.nanoTime();
System.out.println("count: " + count + " | time:" + (end - start)/1000000);
}
private static void version3() {
int count = 0;
long start = System.nanoTime();
try {
Calendar[] calendars = new Calendar[1000];
while(true){
for (int i = 0; i < calendars.length; i++) {
Calendar calendar = Calendar.getInstance();
calendars[i] = calendar;
}
}
} catch (Error e) {
e.printStackTrace();
}
long end = System.nanoTime();
System.out.println("count: " + count + " | time:" + (end - start)/1000000);
}
在这两种情况下,由于外部while (true)
.
,你会永远循环
但是在数组的情况下,在内部循环中,您覆盖了数组的旧值(长度为 1000)。所以内存消耗是恒定的。
在 ArrayList
的情况下,您在内部循环中添加新的 Calendar
对象。所以内存使用量不断增长:1000(第一个循环)+ 1000(第二个循环)+ ...