当前位置: 首页 > 知识库问答 >
问题:

一个Java类中使用的lambdas的最大数量是多少?

荀增
2023-03-14

这是一个纯粹的概念问题。

Java8中的Lambdas转换为使用invokedynamic调用的方法。

如果一个类可以拥有的方法的最大数量有JVM限制,这是否意味着一个类中使用的lambda的最大数量也受到JVM的严格限制?

这个问题和这个差不多吗?一个Java类最多可以有多少个方法?

共有1个答案

毛成济
2023-03-14

Java语言规范没有规定限制,所以我们在这方面只有技术限制。该规范也没有规定特定的编译形式,因此即使是技术限制也是模糊的。

Lambda表达式被编译成承载Lambda表达式主体的类文件的方法,但这并不是严格要求的。最值得注意的是,foo形式的简单表达-

此外,当智能编译器检测到即将达到限制的不太可能的情况时,它可以开始生成承载lambda实体的辅助类。

在当前的直接实现中,方法的最大数量,即65535,会影响可能的lambda表达式的最大数量,但这并不意味着我们可以创建65535个lambda表达式。

例如,必须至少有一个(源代码)方法包含lambda表达式,它将创建函数接口的实例。一个创建站点的最小指令大小是一个具有五个字节的唯一invokedynamic指令。由于一个方法的最大代码大小是65535,并且我们需要至少一个by用于返回指令,因此在一个方法中最多可以有65534/5 == 13106lambda表达式,因此试图创建更多需要将它们放置在不同的方法中,从而减少lambda表达式可用的方法数量。您可以通过使用嵌套的lambda表达式来解决这个问题,即x-

当前的编译器使用命名方案,为每个合成方法产生唯一的名称,所以他们需要单独的常量池条目。因此,有了独特的实现方法,每个lambda创建站点将需要一个名称条目

在使用javac(1.8u111)进行的一次实践测试中,我可以编译一个类文件,其中包含13098个具有相同签名的lambda表达式,甚至在禁用调试符号生成的情况下,在出现错误“太多常量”之前,可以编译出13100个。在该测试类中,我将lambda表达式放入两个构造函数中,因为至少必须存在一个构造函数,并且两者都可以共享名称条目。我认为,用标准的编译器无法获得更多。

如果您想取消命名方案施加的限制,您仍然必须遵守每个方法必须是可区分的规则,因此它必须至少在名称或签名方面与其他方法有所不同。如果试图达到理论上的最大值,则必须将n个不同的方法名称与m个不同的签名结合起来,以允许n×m不同的方法,因此65535个方法将至少需要256个名称条目和256个签名条目。你仍然有唯一的名字

更重要的是,您必须停止为每个lambda表达式生成不同的方法。

这将生成有效的字节码。在源代码级别上,lambda表达式不是语句,因此需要更多代码,例如对变量的赋值。

 类似资料:
  • 问题内容: 我想知道每个jar是否允许最大文件数,然后您会遇到类路径问题,例如不考虑类的问题? 问题答案: jar格式只是重新命名的zip格式,因此它继承了该格式的局限性。 原始zip格式最多只能有65535个条目,因此在Java 6和更早版本中,总共最多可以包含许多类或其他文件。许多工具还包括目录的整体,这减少了可用于类和其他文件的整体。 在Java 7中,支持zip64,但限制更高。 我怀疑失

  • java中vararg可以使用的最大参数数是多少?我相信应该是有限度的,不是无限的。

  • A文件是一种有很好文档记录的格式,它定义了节和大小,因此也定义了最大大小。 例如,a文件包含一个幻数(4字节)、一个版本(4字节)、常量池(可变大小)等。但大小可以在多个级别上定义:可以有65535个方法,每个方法限制为65535字节。 其他限制是什么?如果你想做最大的文件可能是什么大小? 如果需要,限制对Java的回答。意思是如果Scala或Clojure(或…)改变一些限制,忽略这些值。

  • 问题内容: 我想知道是否可以限制您可以返回的带有标记的图像数量? 这是我的代码: 我有50张回来的照片,但我只有20张照片回来。我知道我们已经标记了250多个。 问题答案: 该API每次调用仅返回20张图片。这是数据派上用场的地方,您可以使用Instagram API提供的内容,在此处了解更多信息。 这是用PHP和jQuery编写的,但可以帮助您步入正轨:加载更多示例

  • 问题内容: 与MySQL或其他情况一样,MariaDB 10中的表连接数是否限制为61 ? (我无法在MariaDB文档中或通过谷歌搜索找到答案)。 问题答案: MariaDB在一个联接中具有61个表的最大相同数目。 这个查询 产量。

  • 问题内容: 我最近一直在复制和移动大量文件(约40万个)。我知道在Bash命令行上可以扩展的参数数量有限制,因此我一直在使用xargs来限制产生的数量。 出于好奇,我想知道我可以使用的最大参数数目是多少,我发现这篇文章说它是依赖于系统的,我可以运行以下命令来找出: 令我惊讶的是,我回来的答案是: 刚刚超过 260万 。正如我所说,我要处理的文件数量要少得多,大约为40万。我绝对需要使用移动和复制这