Java匿名对象和垃圾收集部分-1

时间:2015-03-16 15:58:41

标签: java garbage-collection anonymous

public void function(){
   new Student().setName("john");
}

public void function(){
   Student student = new Student();
   student.setName("john");
}
  

对于两个剪辑,GC的行为是否都不同?

     

我的意思是哪种情况(CASE-1 / CASE-2)更具GC效率   时间?

3 个答案:

答案 0 :(得分:4)

  

对于这两个剪辑,GC的行为是否有所不同?

没有。调用setName方法后,使用Student创建的new Student对象将无法再访问,并且可以进行垃圾回收。

  

我的意思是哪种情况(CASE-1 / CASE-2)在时间方面更具GC效率?

两者都没有效率。第一种情况在字节码中将少一个赋值。这不会影响GC。

来自JLS

  

可到达对象是任何可以访问的任何对象   从任何实时线程继续计算。

在两个片段中,在调用setName之后,Student对象不再可访问(假设构造函数和setName方法不会泄漏对象的引用 - 但是即使在这种情况下,两个片段的行为也是一样的)。

答案 1 :(得分:1)

在第一种情况下,您不会将新创建的对象分配给变量,因此只要setName (String name)方法返回,代码就无法访问(因此成为垃圾回收的候选对象)。 p>

在第二种情况下,局部变量student将阻止学生对象在超出范围之前被垃圾收集。换句话说,在第二个片段中,学生对象将在setName(String name)返回后继续成为活动对象,并且只有在方法function()返回后才会成为垃圾收集的候选对象。

更新:

就垃圾收集所需的时间而言,两种情况都是相同的,因为在所有情况下你最终都有一个垃圾对象。

答案 2 :(得分:0)

问题的答案是否定的。

两种情况下Gc的表现几乎相同。

垃圾收集器具有不可预测的行为。但 任何不再被引用或不再使用的对象都有资格进行垃圾回收。

案例1:匿名对象的主要目标是即时使用(一次性使用)。所以在行“new Student()。setName(”john“);”之后,您的匿名对象未被使用,因此它将是GC。

案例2:学生=新学生();

student.setName( “约翰”);

此行之后不再提及学生参考,因此它将是GC。

如果有2个学生参考可能被泄露,但GC很有可能处理这个问题的可能性很小。

现在在案例1中,如果您想要一次性使用对象,那么在堆内存和GC扫描堆内存中创建对象时,请转到匿名对象。堆栈内存的管理方式是堆栈使用的内存自动回收。

您可以参考此link了解更多信息。