Java中是否可以手动删除对象?

Java中是否可以手动删除对象?,java,object,garbage-collection,Java,Object,Garbage Collection,在一些语言中,比如Python,我们可以通过一些方法明确地从堆中“删除”一个对象。例如: s = "This is a Test" del s 现在,对象s不能再使用了。现在,我的问题是,我们可以在Java中做类似的事情吗?是的,我知道它是垃圾收集的,在大多数情况下这是一个巨大的优势,但是如果我想手动删除一个对象呢?顺便问一下,Python中的del实际上是删除了对象,还是删除了引用变量?提前感谢您的帮助 我们可以在Java中做类似的事情吗 没有 最多可以使对象为空: s = null; 这

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

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

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

没有

最多可以使对象为空:

s = null;
这会将对象标记为垃圾收集,并且当尝试使用它时(除非为其分配新值),您将得到一个
NullPointerException

s = null;
...
s.foo(); //this will throw a NullPointerException
我们可以在Java中做类似的事情吗

没有

最多可以使对象为空:

s = null;
这会将对象标记为垃圾收集,并且当尝试使用它时(除非为其分配新值),您将得到一个
NullPointerException

s = null;
...
s.foo(); //this will throw a NullPointerException

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

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

在java中,我们肯定无法删除该对象……但我们可以尝试使用System.gc();或者,如果我们想丢失一个对象的引用,我们可以设置object reference null;的值。。但是在设置空值之后,我们无法访问该对象,但它仍保留在内存中……

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

通常,您需要将对对象的所有引用设置为空,之后该对象将无法再使用,并将在下一次GC中删除。但是字符串常量对象(如“This is a Test”)存储在一个池中,即使没有对它们的引用,也不会被删除。

通常,您需要将对该对象的所有引用设置为null,之后该对象将无法再使用,并将在下一次GC中删除。但是字符串常量对象(如“This is a Test”)存储在一个池中,即使没有对它们的引用也不会被删除。

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

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

你没有删除任何东西-你只是请求运行垃圾收集器,JVM可以忽略你。@Java初学者:很少需要编写
finalize()
方法;真的很难把一个写对;它的存在阻碍了垃圾收集。请看。您没有删除任何内容-您只是请求运行垃圾收集器,JVM可以忽略您。@Java初学者:很少需要编写
finalize()
方法;真的很难把一个写对;它的存在阻碍了垃圾收集。请参阅。为什么要手动“删除”对象?你认为这能实现什么?它不会节省任何东西,而且可能会引入bug。例如,字符串文本存在于字符串缓存中,每次都会得到相同的对象。如果你不止一次运行上面的代码,并且字符串真的被删除了,你会有一个严重的bug。你的前提是错误的。不能在Python中删除对象
del s
删除名称
s
,但不对其引用的对象执行任何操作。当然,如果它是唯一的引用,这会使对象符合垃圾收集的条件,但这没有什么特别的-
s=something
具有完全相同的效果。为什么要手动“删除”对象?你认为这能实现什么?它不会节省任何东西,而且可能会引入bug。例如,字符串文本存在于字符串缓存中,每次都会得到相同的对象。如果你不止一次运行上面的代码,并且字符串真的被删除了,你会有一个严重的bug。你的前提是错误的。不能在Python中删除对象
del s
删除名称
s
,但不对其引用的对象执行任何操作。当然,如果它是唯一的引用,这会使对象符合垃圾收集的条件,但这并没有什么特别的-
s=something
具有完全相同的效果。对象一旦超出范围,就无法访问,这不是真的。从可达性的角度来看,这些对象具有方法范围。因此,
public void run(){{{Object o=new Object();System.out.println(o);}/*o不能再使用了,但它仍然存在!因此下面是一个内存泄漏!*/while(true){try{Thread.sleep(Long.MAX_VALUE);}catch(interruptedeexception e){}}
永远不会在没有
o=null的情况下清理o