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