While true 循环是否总是导致内存不足错误?
Does While true loop always cause Out of memory error?
我一直认为 while (true) {...Any code..} 总是会导致内存不足错误。
但随着我深入 java,它似乎可能并非如此。
我无法确认,但如果我们有一段时间只进行计算,我们预计不会出现内存不足错误,只会非常不利 cpu 性能,对吗?
另一方面,如果我们总是需要更多内存,则预计会出现内存不足错误。
下面我有3个案例。
- 仅计算(我认为后台没有分配内存)
- 不断增加 arraylist,它看起来是一个明显的内存不足错误
- 始终使用 new 关键字实例化 arraylist。我不知道它是否会导致内存不足错误,因为垃圾收集器。
我没有测试我的电脑,因为我只有一台,希望有人知道。
代码
import java.util.*;
public class HelloLeak{
//calculations only, MemoryLeak?
public static void outofmemo1(){
long i = 0;
while (true)
{
i = i * i;
}
}
//adding infinite number of objects, memory leak confirmed.
public static void outofmemo2(){
int i = 0;
List<Integer> l = new ArrayList<>();
while (true)
{
l.add(i);
}
}
//Creating infinite number of ArrayList objects, will garbage collector clear the unused objects or we will get memory leak?
public static void outofmemo3(){
List<Integer> l = new ArrayList<>();
while (true)
{
l = new ArrayList<>();
}
}
public static void main(String []args){
outofmemo1();
//outofmemo2();
//outofmemo3();
}
}
- 除了以无限循环结束外,绝对不会做任何事情。
- 会因 OutOfMemoryError 而崩溃,因为您总是向列表中添加新元素,直到堆被填满。
- 会像 1。但是您可能有高达 2GB 的峰值,然后 GC 会来,看到有未使用的对象,将它们删除。之后又会飙升,以此类推
我一直认为 while (true) {...Any code..} 总是会导致内存不足错误。
但随着我深入 java,它似乎可能并非如此。
我无法确认,但如果我们有一段时间只进行计算,我们预计不会出现内存不足错误,只会非常不利 cpu 性能,对吗? 另一方面,如果我们总是需要更多内存,则预计会出现内存不足错误。
下面我有3个案例。
- 仅计算(我认为后台没有分配内存)
- 不断增加 arraylist,它看起来是一个明显的内存不足错误
- 始终使用 new 关键字实例化 arraylist。我不知道它是否会导致内存不足错误,因为垃圾收集器。
我没有测试我的电脑,因为我只有一台,希望有人知道。
代码
import java.util.*;
public class HelloLeak{
//calculations only, MemoryLeak?
public static void outofmemo1(){
long i = 0;
while (true)
{
i = i * i;
}
}
//adding infinite number of objects, memory leak confirmed.
public static void outofmemo2(){
int i = 0;
List<Integer> l = new ArrayList<>();
while (true)
{
l.add(i);
}
}
//Creating infinite number of ArrayList objects, will garbage collector clear the unused objects or we will get memory leak?
public static void outofmemo3(){
List<Integer> l = new ArrayList<>();
while (true)
{
l = new ArrayList<>();
}
}
public static void main(String []args){
outofmemo1();
//outofmemo2();
//outofmemo3();
}
}
- 除了以无限循环结束外,绝对不会做任何事情。
- 会因 OutOfMemoryError 而崩溃,因为您总是向列表中添加新元素,直到堆被填满。
- 会像 1。但是您可能有高达 2GB 的峰值,然后 GC 会来,看到有未使用的对象,将它们删除。之后又会飙升,以此类推