代码之家  ›  专栏  ›  技术社区  ›  Dayne Kramer

对已创建的对象使用“new”语句是否会导致内存泄漏?

  •  0
  • Dayne Kramer  · 技术社区  · 8 年前

    我对这个问题做了一些研究,但还没有真正找到答案。

    例如,我知道如果我在游戏循环中写下这句话:

    public void update () {
        Object object = new Object();
    }
    

    那我就有内存泄漏了。

    但是如果你有一个类对象,你正在调用 new 在上,它不会导致内存泄漏,对吗?因为您没有创建另一个对象,所以您只是给当前对象一个新值。

    例如:

    private Object object;
    
    //...
    
    public void update () {
        object = new Object();
    }
    

    -编辑

    谢谢你的帮助!我现在明白了,我几乎不知道什么是内存泄漏或是什么导致了它。。。但我现在比以前了解得更多!

    2 回复  |  直到 8 年前
        1
  •  3
  •   Andy Turner    8 年前

    你的问题的前提是有缺陷的。

    从不 呼叫新 在…上 已创建的对象。您调用new,并且总是(根据规范)得到一个新对象(或者发生异常或错误之类的情况)。

    这里要问的是将它们分配给变量或字段。就其本身而言,从内存泄漏的角度来看,它是变量还是字段都没有区别。该字段或变量是否也已初始化也没有区别:您只是将对一个对象的引用替换为对另一个对象的引用。

    唯一有区别的是如果你 而且 将对象添加到列表(或其他集合、数组等),或将包含字段的对象添加到列表等:这样,就不可能进行垃圾收集,因为对象仍然可以访问。那么你就会有内存泄漏。

        2
  •  2
  •   ewramner    8 年前

    这些例子都不是内存泄漏。没有内存丢失。垃圾收集器将回收内存,因为没有对它的引用。不过,这两个示例都分配内存。每次调用new时,它都会分配一个新对象。是否将新对象存储在某个位置并不重要。因此,在这两种情况下,这在一个紧密的循环中都是不好的,因为它会分配内存,然后必须对内存进行垃圾收集。

    另一方面,Java非常聪明,因此如果这两个示例都处于一个紧密的循环中,因为您没有使用这些值,那么它很可能会在一段时间后优化掉这两个示例。为了避免这种情况(如果您真的想要慢代码),请将变量设置为volatile。