gpt4 book ai didi

java - 在 Java 中对变量使用 final 会改善垃圾收集吗?

转载 作者:IT老高 更新时间:2023-10-28 11:41:11 41 4
gpt4 key购买 nike

今天我和我的同事讨论了在 Java 中使用 final 关键字来改进垃圾收集。

例如,如果您编写一个方法,例如:

public Double doCalc(final Double value)
{
final Double maxWeight = 1000.0;
final Double totalWeight = maxWeight * value;
return totalWeight;
}

在方法final中声明变量将有助于垃圾回收在方法退出后从方法中未使用的变量中清理内存。

这是真的吗?

最佳答案

这里有一个稍微不同的例子,一个带有最终引用类型的字段而不是最终值类型的局部变量:

public class MyClass {

public final MyOtherObject obj;

}

每次创建 MyClass 实例时,都会创建对 MyOtherObject 实例的传出引用,并且 GC 必须通过该链接查找 Activity 对象。

JVM 使用标记扫描 GC 算法,该算法必须检查 GC“根”位置中的所有 Activity 引用(就像当前调用堆栈中的所有对象一样)。每个 Activity 对象都被“标记”为 Activity 对象, Activity 对象引用的任何对象也被标记为 Activity 对象。

标记阶段完成后,GC 扫过堆,为所有未标记的对象释放内存(并为剩余的 Activity 对象压缩内存)。

此外,重要的是要认识到 Java 堆内存被划分为“年轻一代”和“老一代”。所有对象最初都在年轻代(有时称为“托儿所”)中分配。由于大多数对象都是短暂的,GC 更积极地从年轻代中释放最近的垃圾。如果一个对象在年轻代的收集周期中存活下来,它就会被移入老年代(有时称为“老年代”),而老年代的处理频率较低。

所以,在我的脑海中,我要说“不,'final' 修饰符不会帮助 GC 减少其工作量”。

在我看来,在 Java 中优化内存管理的最佳策略是尽快消除虚假引用。您可以在使用完对象引用后立即将“null”分配给它。

或者,更好的是,最小化每个声明范围的大小。例如,如果您在 1000 行方法的开头声明一个对象,并且如果该对象在该方法的范围关闭(最后一个闭合花括号)之前保持 Activity 状态,那么该对象可能会比实际保持 Activity 更长时间必要的。

如果您使用只有十几行代码的小方法,那么在该方法中声明的对象将更快地超出范围,并且 GC 将能够在以下范围内完成大部分工作-更高效的年轻一代。除非绝对必要,否则您不希望将对象移入老一代。

关于java - 在 Java 中对变量使用 final 会改善垃圾收集吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/306862/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com