代码之家  ›  专栏  ›  技术社区  ›  Foo

为什么此代码不会导致我的计算机内存耗尽?

  •  1
  • Foo  · 技术社区  · 10 年前

    在玩东西的时候,我碰到了这样的东西。这段代码不会导致我的内存耗尽。

    while(true)
    {
        Person p=new Person();       
    }
    

    除非垃圾收集每隔几秒钟运行一次,否则我无法解释为什么我的内存使用率(在任务管理器中)没有上升。

    那么java中的垃圾收集运行得那么频繁吗?还是windows中的任务管理器在显示内存使用情况方面做得不好?

    使现代化 : 我用Java Visual VM监视它。垃圾收集器在我运行的几分钟内从未被激活。

    3 回复  |  直到 10 年前
        1
  •  6
  •   Sleiman Jneidi    10 年前

    GC知道何时运行,何时需要运行 Person 它太短了,GC会在伊甸园空间里扫过它,甚至不会晋升到老一代。

        2
  •  1
  •   Louis Wasserman    10 年前

    Java中的垃圾收集基本上会尽可能频繁地运行。每当堆被填满时,GC就会发生。如果不进行分配,GC将不会运行;如果只进行分配,则GC将经常运行。更重要的是,如果不先运行GC,Java将永远不会出现OutOfMemoryError。

    在某些情况下,JIT还可以识别对象何时明显超出范围或仅在本地需要,并且在这种情况下可以进行堆栈分配,而不需要任何GC。

        3
  •  0
  •   Toni Pujol    10 年前

    在每个循环中,创建并销毁对象。垃圾仅在必要时释放内存。如果只想发生内存错误,则必须在while之外创建一个ArrayList,同时将人员添加到ArrayList中。