我有一个与new
关键字相关的查询。
1。有什么区别
new Demo().abc();
和
Demo demo=new Demo();
demo.abc();
demo=null;
2。 如果我使用第一个然后自动垃圾收集器删除内存?
我的问题是:
如何删除以下对象的内存:
new Demo().abc();
答案 0 :(得分:5)
案例-1:
new Demo().abc();
在这里,我们没有为新创建的Demo
实例维护任何显式引用。但在abc()
内,this
引用将指向新创建的实例。因此,如果引用没有从abc()
泄漏,则只要方法返回,新创建的Demo
实例就可以为GC准备(因为它变为无法访问来自任何线程)。
如果存在这样的参考泄漏:
public void abc()
{
someOtherMethod(this); // starts another thread and does something else
...
}
在上述情况下,即使abc()
返回,创建的Demo
实例仍然可以访问,因此不符合GC的条件。
案例-2:
Demo demo=new Demo();
demo.abc();
demo=null;
此处,只要您将demo
设置为null
并假设abc()
不会将demo
的引用泄露给其他某个帖子,您demo
将实例设置为null
后,实例将变为无法访问,因此,将符合GC 的条件。
答案 1 :(得分:0)
您没有明确地执行任何操作来删除"new Demo().abc()"
,通常只要没有对此Demo()对象的强引用,它就会获得JVM收集的垃圾。