Java 是否使用;新";已创建对象上的语句是否导致内存泄漏?

Java 是否使用;新";已创建对象上的语句是否导致内存泄漏?,java,memory,memory-leaks,Java,Memory,Memory Leaks,我对这个问题做了一些研究,但还没有找到答案 例如,我知道如果我在游戏循环中写下: public void update () { Object object = new Object(); } 那我就有内存泄漏了 但是如果您有一个正在调用的类对象new,它不会导致内存泄漏,对吗?因为您没有创建另一个对象,所以您只是给当前对象一个新值 例如: private Object object; //... public void update () { object = new O

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

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

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

那我就有内存泄漏了

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

例如:

private Object object;

//...

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


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

你问题的前提是有缺陷的

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

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


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

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

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

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


唯一不同的是,如果您还将对象添加到列表(或其他集合、数组等),或者将包含字段的对象添加到列表等:那么,就不可能进行垃圾收集,因为对象仍然是可访问的。那么您就会出现内存泄漏。

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


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

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


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

“那么我会有内存泄漏。”这不是真的。只有在引用对象的方法完成后仍保留该对象,才会出现内存泄漏,否则它将只是GC'dobject@dasblinkenlight请讲清楚。
[教我]
你有很多误解。您混淆了变量和对象(变量是对对象的引用)。Java没有“类变量”,并且
对象
是一个类,而不是任何类型的变量。java中的内存泄漏与C++或C++中的内存泄漏有很大的不同。您没有对任何东西调用
new
new
是一个表达式(操作符?),它创建给定类的实例。请忘记所有关于Java的知识,从一个像样的教程开始。如果你在大学/学校学习Java,你需要教授/老师的很多帮助。我明白了!我想我一开始不太明白什么是内存泄漏!谢谢你们的帮助!至于把一个变量和一个对象混在一起,那只是一个愚蠢的错误。我完全理解两者之间的区别,我只是没有思考!“那我就有内存泄漏了。”这不是真的。只有在引用对象的方法完成后仍保留该对象,才会出现内存泄漏,否则它将只是GC'dobject@dasblinkenlight请讲清楚。
[教我]
你有很多误解。您混淆了变量和对象(变量是对对象的引用)。Java没有“类变量”,并且
对象
是一个类,而不是任何类型的变量。java中的内存泄漏与C++或C++中的内存泄漏有很大的不同。您没有对任何东西调用
new
new
是一个表达式(操作符?),它创建给定类的实例。请忘记所有关于Java的知识,从一个像样的教程开始。如果你在大学/学校学习Java,你需要教授/老师的很多帮助。我明白了!我想我一开始不太明白什么是内存泄漏!谢谢你们的帮助!至于把一个变量和一个对象混在一起,那只是一个愚蠢的错误。我完全理解两者之间的区别,我只是没有思考!这完全没有区别