【问题标题】:Does While true loop always cause Out of memory error?While true 循环是否总是导致内存不足错误?
【发布时间】:2020-07-15 10:03:51
【问题描述】:

我一直认为 while (true) {...Any code..} 总是会导致内存不足错误。

但随着我对 java 的深入了解,它似乎可能不是那样的。

我无法确认,但如果我们有一段时间只进行计算,我们预计不会出现内存不足错误,只会对 CPU 性能造成非常不利的影响,对吧? 另一方面,如果我们总是需要更多内存,则预计会出现内存不足错误。

我有以下 3 个案例。

  1. 仅计算(我认为没有在后台分配内存)
  2. 不断增加的 arraylist 看起来是明显的内存不足错误
  3. 总是用新的关键字来实例化数组列表。我不知道它是否会因为垃圾收集器而导致内存不足错误。

我没有测试我的电脑,因为我只有一台,希望有人知道。

代码

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(); 
     }
}

【问题讨论】:

  • “如果我们总是需要更多内存,那么它预计会发生内存泄漏”,您继续使用这些词,“内存泄漏”。我不认为他们的意思是你认为他们的意思。
  • “我没有测试我的电脑,因为我只有一个” - 你认为内存泄漏会破坏你的电脑吗?
  • @maloomeister 好吧,如果你的内存在你的主板上泄漏,它可能会短路一些东西。 /s
  • @maloomeister 我不怕内存泄漏,但我担心过度消耗 cpu 程序会阻塞我的所有程序并最终烧毁某些东西。所以担心是错误地创建了一个运行无限循环的程序,唯一的解决方案是强行关闭我的电脑以避免最坏的情况。 (发生过一次)
  • 嗨@FedericoklezCulloca,你说得对,我误用了这个词。对于那个很抱歉。这不是内存泄漏,而是内存不足错误。因为程序会消耗太多内存。如果我认为我有无法从内存中删除的无法访问的对象,则会导致内存泄漏。让我修正一下标题和文字

标签: java memory-leaks


【解决方案1】:
  1. 除了以无限循环结束之外,绝对不会做任何事情。
  2. 会因 OutOfMemoryError 而崩溃,因为您总是向列表中添加一个新元素,直到堆满为止。
  3. 将类似于 1。但您可能会出现高达 2GB 的峰值,然后 GC 会来,看到有未使用的对象,将它们删除。之后它会再次飙升,依此类推

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 2014-06-07
    相关资源
    最近更新 更多