Rob*_*oli 3 java optimization garbage-collection final
这个问题是这个问题的延续,但要求更具体的方案.
可以说我们有以下课程:
public class Person {
private Foot left, right;
public Person(Foot left, Foot right) {
this.left = left;
this.right = right;
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道如果我们将其转化为以下内容,是否可以从GC的角度对以下类进行优化:
public class Person {
private final Foot left, right;
public Person(Foot left, Foot right) {
this.left = left;
this.right = right;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我正在查看这个类,我可以立即告诉左,右变量永远不能提前设置为null.这意味着,只有当父类Person的引用达到零时,GC才需要收集此类的左对象和右对象(并减少对它的引用).它还应该意味着它可以在收集左右脚对象的同时收集人; 也导致更少的运行和加速.
因此,在这个例子中,标记私有成员变量最终是否意味着代码甚至会导致垃圾收集中的次要加速(或者它可能用作加速点)?
分配给字段不会触发任何垃圾收集器工作或引用计数调整,因为Java GC不使用引用计数(*).所以答案是声明一个字段final
对垃圾收集器的性能没有任何影响.(收集器的跟踪阶段必须检查该字段是否存在final
.
可以想象,声明一个字段final
可以帮助JIT编译器的数据流分析和内存提取的优化.但是,将其用作更改字段的理由是一个坏主意final
.如果您打算这样做,请出于正确性原因(即在并发环境中使构造安全)或出于风格原因(即使代码更易于理解和维护).
(*没有主流Java实现依赖于引用计数来实现内存管理.理论上可能有人可能实现了使用引用计数的JVM,但传统观点认为引用计数非常低效...更不用说并发性问题,收集周期,等等.)