在某些语言中,例如Python
,我们可以通过一些方法显式地从堆中“删除”一个对象。例如:
s = "This is a Test"
del s
现在,该对象s
不能再使用了。现在,我的问题是,我们可以做类似的事情Java
吗?是的,我知道它是垃圾回收的,这在大多数情况下是一个巨大的优势,但是如果我想手动删除一个对象怎么办?顺便说一句,del
在 Python 中实际上是删除了对象,还是删除了引用变量?提前感谢您的帮助!
在某些语言中,例如Python
,我们可以通过一些方法显式地从堆中“删除”一个对象。例如:
s = "This is a Test"
del s
现在,该对象s
不能再使用了。现在,我的问题是,我们可以做类似的事情Java
吗?是的,我知道它是垃圾回收的,这在大多数情况下是一个巨大的优势,但是如果我想手动删除一个对象怎么办?顺便说一句,del
在 Python 中实际上是删除了对象,还是删除了引用变量?提前感谢您的帮助!
我们可以在 Java 中做类似的事情吗?
不。
最多可以使对象无效:
s = null;
这会将对象标记为垃圾回收,并且在尝试使用它时(除非为其分配新值),您将获得一个NullPointerException
.
s = null;
...
s.foo(); //this will throw a NullPointerException
在java中我们肯定不能删除对象......但我们可以尝试使用 System.gc(); 或者如果我们想丢失对象的引用,我们可以将对象引用的值设置为 null;..但设置空值后我们无法访问该对象,但它仍然保留在内存中......
通常,您需要清空对该对象的所有引用,之后该对象将无法再使用,并将在下一次 GC 时被删除。但是像“这是一个测试”这样的字符串常量对象存储在一个池中,即使没有对它们的引用也不会被删除。
一旦超出范围,该对象将从堆中删除。您可以将其包含s
在使用它的最小可能范围内。即要么包含在 {} 大括号块中,要么定义一个单独的方法来使用它
正如 Luiggi Mendoza 所说,您不能手动删除。您可以参考它NULL
。要释放内存,你可以调用System.gc()
。但不能保证内存会被释放。在从内存中删除对象之前,垃圾收集线程调用该对象的 finalize() 方法,并提供执行所需的任何类型清理的机会。