我的问题是关于JVM 1.8中匿名对象的处理和生命周期。Lambda表达式匿名对象生命周期
就我所知,在JDK 1.8中,lambda表达式的基本机制不是纯粹基于函数的。即它仍然使用我们在代码中定义的方法创建一个匿名对象,并根据匿名对象调用该方法。另外,因为lambda表达式不会引入任何新的变量作用域,所以在lambda表达式中调用“this”将引用原始对象而不是这种匿名方法。
自然,问题如下:JVM如何处理这种匿名对象的生命周期?定义包含这种lambda表达式的对象方法为“外部对象方法”,至少我有以下问题。
如果外部对象方法是普通方法,那么这个匿名对象是属于实例级别还是类级别?如果外部方法是静态的呢?
如果外部对象方法被多次调用,这个匿名对象会被重新使用还是重新创建?
这样的对象是否受JVM GC支配?如果是,则GC规则与其他对象保持相同?
有没有任何工具或API来跟踪这种匿名对象的生命周期,因为它不能直接在代码中被引用?
赞赏任何帮助或评论或文件。
1)和2)或多或少地取决于JVM的实现,尽管HotSpot对于这些事情非常聪明。 3)是的,正常。 4)你可以正常地追踪它;如果您愿意,您可以直接将其分配给功能接口类型并进行正常跟踪。 – 2014-11-01 08:22:33
谢谢。如果我们有一些正式的文档,那会很好。对于传递对象肯定是可追踪的;但是我想知道如果嵌入这样的对象的实现。它可能应该是相同的机制,但你知道,有时候有例外。 – 2014-11-03 01:44:28
我有一个关于这个匿名对象的生命周期的类似问题,如果我把一个循环创建lambda表达式,Java运行时将创建这个匿名对象的多个实例。 – apersiankite 2017-01-12 13:11:19