public void function(){
new Student().setName("john");
}
public void function(){
Student student = new Student();
student.setName("john");
}
对于两个剪辑,GC的行为是否都不同?
我的意思是哪种情况(CASE-1 / CASE-2)更具GC效率 时间?
答案 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了解更多信息。