2

在某些语言中,例如Python,我们可以通过一些方法显式地从堆中“删除”一个对象。例如:

s = "This is a Test"
del s

现在,该对象s不能再使用了。现在,我的问题是,我们可以做类似的事情Java吗?是的,我知道它是垃圾回收的,这在大多数情况下是一个巨大的优势,但是如果我想手动删除一个对象怎么办?顺便说一句,del在 Python 中实际上是删除了对象,还是删除了引用变量?提前感谢您的帮助!

4

5 回答 5

1

我们可以在 Java 中做类似的事情吗?

不。

最多可以使对象无效:

s = null;

这会将对象标记为垃圾回收,并且在尝试使用它时(除非为其分配新值),您将获得一个NullPointerException.

s = null;
...
s.foo(); //this will throw a NullPointerException
于 2013-09-21T04:15:34.030 回答
1

在java中我们肯定不能删除对象......但我们可以尝试使用 System.gc(); 或者如果我们想丢失对象的引用,我们可以将对象引用的值设置为 null;..但设置空值后我们无法访问该对象,但它仍然保留在内存中......

于 2013-09-21T04:25:25.627 回答
1

通常,您需要清空对该对象的所有引用,之后该对象将无法再使用,并将在下一次 GC 时被删除。但是像“这是一个测试”这样的字符串常量对象存储在一个池中,即使没有对它们的引用也不会被删除。

于 2013-09-21T04:30:24.720 回答
1

一旦超出范围,该对象将从堆中删除。您可以将其包含s在使用它的最小可能范围内。即要么包含在 {} 大括号块中,要么定义一个单独的方法来使用它

于 2013-09-21T04:32:52.690 回答
0

正如 Luiggi Mendoza 所说,您不能手动删除。您可以参考它NULL。要释放内存,你可以调用System.gc()。但不能保证内存会被释放。在从内存中删除对象之前,垃圾收集线程调用该对象的 finalize() 方法,并提供执行所需的任何类型清理的机会。

于 2013-09-21T04:18:35.737 回答