gpt4 book ai didi

java - 是否收集了 lambda 垃圾?

转载 作者:搜寻专家 更新时间:2023-10-31 08:11:56 29 4
gpt4 key购买 nike

如果我没记错的话,在某些情况下,Java 中的 lambda 会生成为匿名类实例。例如,在这段代码中,lambda 需要从外部捕获一个变量:

final int local = 123456;
list.forEach(x -> System.out.println(x + local));

这是否意味着垃圾收集器会将 lambda 声明为一个对象?

最佳答案

是的,表示 lambda 表达式的实例就像任何其他对象一样被垃圾收集。如果包含 lambda 表达式的类符合收集条件,甚至可以收集实现功能接口(interface)的类。

上述lambda没有被收集的原因是lambda bootstrap方法优化的结果。通常,引导方法将静态工厂方法绑定(bind)到 invokedynamic 调用站点。如果需要,该工厂采用封闭方法的所有必需变量和对声明实例的引用。然后,工厂创建表示 lambda 的类实例,并将所有值存储在该实例的字段中。

但是,如果 lambda 表达式没有任何状态,bootstrap 方法会创建一个单例,然后直接绑定(bind)到 lambda 表达式的调用站点。自然地,这个单例不能在封闭类之前被收集。

如果您想了解更多有关 invokedynamic 和 lambda 表达式如何工作的信息,我最近写了一篇总结:http://mydailyjava.blogspot.no/2015/03/dismantling-invokedynamic.html?m=1

这是 HotSpot 的当前实现, Bootstrap 将来可能会发生变化。

关于java - 是否收集了 lambda 垃圾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27212730/

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