【发布时间】:2014-11-01 07:01:39
【问题描述】:
我的问题是关于 JVM 1.8 中匿名对象的处理和生命周期。
据我所知,在 JDK 1.8 中,lambda 表达式的底层机制并不是纯粹基于函数的。 IE。它仍然使用我们在代码中定义的方法创建一个匿名对象,并在匿名对象上调用该方法。另外,由于 lambda 表达式没有引入任何新的变量作用域,因此在 lambda 表达式中调用“this”将引用原始对象而不是此类匿名方法。
问题自然就来了:JVM 是如何处理这种匿名对象的生命周期的?将包含此类lambda表达式的对象方法定义为“外部对象方法”,至少我有以下问题。
如果外部对象方法是普通方法,这个匿名对象是属于实例级别还是类级别?如果外部方法是静态的呢?
如果外部对象方法被多次调用,这个匿名对象会被重用还是重新创建?
此类对象是否受 JVM GC 约束?如果是,GC 规则是否与其他对象相同?
鉴于无法在代码中直接引用,是否有任何工具或 API 可以跟踪此类匿名对象的生命周期?
感谢任何帮助、评论或文档。
【问题讨论】:
-
1) 和 2) 或多或少取决于 JVM 的实现,尽管 HotSpot 在这些方面非常聪明。 3)是的,像往常一样。 4) 你可以正常追踪它;如果需要,您可以将其直接分配给功能接口类型并正常跟踪它。
-
谢谢。如果我们在某个地方有一些正式的文档会很好。对于通过 yes 的对象,它肯定是可跟踪的;但我想知道是否嵌入了这样的对象。它可能应该是相同的机制,但你知道,有时会有例外。
-
我有一个关于这个匿名对象生命周期的类似问题,如果我把创建 lambda 表达式放在一个循环中,Java Runtime 会创建这个匿名对象的多个实例。
标签: java object lambda garbage-collection lifecycle