这么快的问题:
如果我有一个使用大量lambda表达式的程序,那么每个lambda是否创建了一个存储在metaspace
中的新类?
通常情况下如果它存储在那里会很好,但是如果你还添加了java标志-Xnoclassgc
,那么会产生泄漏,最终导致程序崩溃吗?
答案 0 :(得分:1)
添加-Xnoclassgc
标志并不会禁用整个Garbage Collector
。它仅禁用Garbage Collector
中的PermGen
个类。
但是,在 JDK8 中,我们不再拥有PermGen
,因为元数据现在已移至本地内存中的Metaspace
区域。
另一方面,Java中的Lambda
表达式是功能接口的实例(功能接口是一个只包含一个摘要的接口方法)。
换句话说,lambdas是 objects
并像处理其他对象一样处理并存储在堆上,因此编译器不会为每个lambda实例创建.class
文件。 / p>
答案 1 :(得分:0)
简短的回答是否定的。
他们使用Java 7中引入的指令 - invokedynamic
您可以观看此演示文稿以获取更多信息 - https://www.infoq.com/presentations/lambda-invokedynamic