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

Java Anonymous object and Garbage collection part -1

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

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

Does GC behave differently for both of the snip?

I mean which case (CASE-1/CASE-2) is more GC efficient in terms of Time?

Does GC behave differently for both of the snip?

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

I mean which case (CASE-1/CASE-2) is more GC efficient in terms of Time?

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

来自JLS

A reachable object is any object that can be accessed in any potential continuing computation from any live thread.

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

在第一种情况下,您没有将新创建的对象分配给变量,因此一旦 setName (String name) 方法 returns.

在第二种情况下,局部变量 student 将阻止学生对象被垃圾回收,直到它超出范围。换句话说,在第二个片段中,学生对象在 setName(String name) returns 之后将继续作为活动对象,并且仅在方法 function() [=22= 之后成为垃圾收集的候选对象].

更新:

就垃圾收集所需的时间而言,这两种情况是相等的,因为在所有这些情况下,您最终都会得到一个垃圾对象。

问题的答案是否定的。

Gc 在这两种情况下的行为几乎相同。

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

Case 1 : Main objective 匿名对象是即时使用(一次性使用)。所以在行 "new Student().setName("john");" 之后,您的匿名对象未被使用,因此它将被 GC。

案例 2:学生 student = new Student();

student.setName("john");

此行之后不再引用学生参考,因此它将成为 GC。

案例 2 的学生参考信息泄露的可能性很小,但 GC 足够聪明,可以处理这个问题。

现在在情况 1 中,如果您希望对象一次性使用,那么请选择匿名对象,因为对象是在堆内存中创建的,GC 会扫描堆内存。堆栈内存的管理方式是自动回收堆栈使用的内存。

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