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 了解更多。
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 了解更多。