如果我这样做会发生什么:
Object obj = new Object();
obj = null;
它是从内存中删除对象,还是只清除引用?
更正式地说,考虑守则:
Object obj = new Object();
Object temp = obj;
obj = null;
为什么temp
仍然不是null
?它不应该被从记忆中删除吗?
Object obj = new Object();
obj = null;
上图:它只删除引用,不删除对象。但是,GC将从内存中清除该对象,因为没有对该对象的其他引用。
在这方面:
Object obj = new Object();
Object temp = obj;
obj = null;
temp仍然是对象的引用,因此对象保留在内存中。
将对象设置为null,清除引用。如果不再有对该对象的任何引用,就像在第一个示例中一样,当JVM下一次运行GC(草收集器)时,可以释放内存。
只要仍然存在对对象的引用(第二个示例),就不会发生这种情况。
此外,通过GC释放内存和将内存返回操作系统之间存在差异,因此可以重用内存。通常,JVM会保留一次分配的内存,直到JVM存在或操作系统的可用内存耗尽。
在第一个例子中:
+------+
obj -------> |OBJECT|
+------+
将obj
设置为null
后:
+------+
obj |OBJECT|
+------+
不存在对对象的引用,因此它“不存在”,因为它已变得不可访问。
在你的第二个例子中:
obj -------> +------+
|OBJECT|
temp ------> +------+
将obj
设置为null
后:
obj +------+
|OBJECT|
temp ------> +------+
您可以看到temp
仍然引用对象,因此它仍然“存在”。
问题内容: 帮助我与同事解决争执:在Java中将变量或集合设置为null是否有助于垃圾回收并减少内存使用?如果我有一个运行时间较长的程序,并且每个函数都可能被迭代调用(可能数千次):在将值返回给父函数之前将其中的所有变量设置为null是否有助于减少堆大小/内存使用量? 问题答案: 那是旧的表演传奇。在1.0天之内确实如此,但是对编译器和JVM进行了改进以消除这种需求(如果有的话)。如果您感兴趣,这
问题内容: 我最近正在研究释放Java对象占用的内存。这样做的时候,我对如何在Java中复制对象(浅/深)以及如何避免在使用中意外清除/无效化对象感到困惑。 请考虑以下情形: 将a 作为参数传递给方法。 将a传递给要由线程处理的可运行类。 将放入。 现在,在这些情况下,如果我调用或,对象将如何处理?在哪种情况下丢失对象,在哪种情况下仅将引用设置为null? 我想这与对象的浅层复制和深层复制有关,但
null 在这种情况下,如果我调用或,对象会发生什么?在哪种情况下,对象丢失了,在哪种情况下,只有引用被设置为NULL? 我想这与对象的浅层和深层复制有关,但在Java中,在哪些情况下浅层复制发生,在哪些情况下深层复制发生?
问题内容: PHP中是否有一种方法可以确定给定变量是否是对另一个变量的引用和/或被另一个变量引用?考虑到php.net上的注释,设置可能意味着“ $ a和$ b在这里完全相等。 我可能会无法分开检测“对……的引用”和“对……的引用” 。$ a并不指向$ b或反之亦然。$ a和$ b指向同一位置。 ” 如果无法确定给定变量是否是引用/引用,是否存在一种通用方法来确定两个变量是否是彼此引用?再次,对p
问题内容: 我需要检查value是否定义为任何东西,包括null。将null值视为undefined并返回。以以下为例: 请注意,这是未定义的。 我需要找到满足以下条件的条件: 有任何想法吗? 问题答案: IIRC,您可以使用此功能:
问题内容: 浏览OpenJDK 8中的java.util.LinkedList代码,发现以下代码。该代码很简单,但是我对将对第一个节点的引用保存到第二行代码中的常量感到困惑。据我了解,此代码将内联到单行代码中,而无需引用复制。我对吗?如果是这样, 为什么在这种情况和类似情况下需要复制引用 (这种习语可能在java.util.LinkedList的一半方法中找到)? 我的第一个想法是,它以某种方式有