1 java garbage-collection memory-management new-operator
我有一个与new关键字相关的查询.
1.有什么区别
new Demo().abc();
Run Code Online (Sandbox Code Playgroud)
和
Demo demo=new Demo();
demo.abc();
demo=null;
Run Code Online (Sandbox Code Playgroud)
2.如果我使用第一个然后自动垃圾收集器删除内存?
我的问题是:
如何删除以下对象的内存:
new Demo().abc();
Run Code Online (Sandbox Code Playgroud)
情况1 :
new Demo().abc();
在这里,我们没有保持对新创建的实例的任何显式引用Demo.但在内部abc(),this引用将指向新创建的实例.因此,如果引用没有泄漏abc(),则只要方法返回,新创建的Demo实例就会为GC做好准备(因为它无法从任何线程访问).
如果有这样的参考泄漏:
public void abc()
{
someOtherMethod(this); // starts another thread and does something else
...
}
Run Code Online (Sandbox Code Playgroud)
在上述情况下,即使abc()返回,Demo创建的实例仍然可以访问,因此不符合GC的条件.
案例-2:
Demo demo=new Demo();
demo.abc();
demo=null;
Run Code Online (Sandbox Code Playgroud)
一旦你设置demo为null并假设abc()没有泄漏demo对某个其他线程的引用,你的demo实例一旦设置就会变得无法访问null,因此它将符合GC的条件.