Java中方法的最大大小是多少?

28
我了解到,在Java中方法的最大大小为64k。如果超过此大小,我们将收到编译器警告,如“代码太大无法编译”。那么,我们能否称这是Java的一个缺点,因为内存量太小呢?
我们能否增加此大小限制或者真正可能增加呢?
关于此方法大小,还有其他想法吗?

1
(a) 你在哪里读到这个的? (b) 这有什么关系呢? - Oliver Charlesworth
26
这个限制应该设置为2k,以强制进行重构和优美的设计 :) 就像将255个方法参数的限制设置为10一样。 - Lukas Eder
3
如果你的代码中某个方法的大小超过了64kb,那么也许是时候进行重构了?请注意,此处翻译的是(b)部分。 - SJuan76
3
@Lukas Eder - 我正有同样的想法,缺点是太多了 :) - MByD
3
@Max:对于一个预编译器来说,将代码拆分成两个方法非常简单。 - Lukas Eder
显示剩余4条评论
3个回答

37

据我的经验,64KB的限制只是针对生成的代码有影响,尤其是在初始化大型数组时(这通常是在代码中完成的)。

在良好结构的代码中,每个方法的长度都可控制且远小于此限制。要加载到数组中的大数据块可以从非Java文件(如文本或二进制文件)中读取。

编辑:

值得注意的是,JIT不会编译大于8K的方法。这意味着代码运行速度会变慢,并且会影响垃圾回收时间(因为在搜索未编译的方法调用堆栈时效率较低,特别是对于大型方法)。

如果可能,应该将方法限制在8K而非64K以内。


3
我对限制的解决办法是为生成的代码的每N行生成一个方法,然后在一个新方法中调用它们所有。 - Diederik
2
@Diederik,很遗憾编译器不能为你做到这一点,或者字节码不支持更大的方法。 - Peter Lawrey
4
我曾多次看到人们在使用JSP时达到了这个限制。默认情况下,JSP会被编译成一个巨大的doGet()方法的Servlet,其中包含JSP中的所有内容。那些需要在一页中添加大量内容但没有将JSP分割为片段的人似乎会遇到这个问题,因此这不仅是生成的代码的问题。 - eis
4
我曾经被这个问题困扰过两次。一次是使用Java版本的YACC或LEX,它们可以生成一个非常大的状态机并实现在一个方法中。另一次是在尝试测量代码覆盖率时出现的。覆盖率工具会用额外的字节码对.class文件进行仪器化以收集运行时数据。即使原始代码比64K小得多,仪器化字节码也可能将方法推到超过64K的限制。 - Dan Haynes
1
@MeBigFatGuy 请查看https://www.youtube.com/watch?v=wgQBz2Ldhvk&t=511s - 重要补充:我们讨论的是字节码,而不是你所编写的Java代码的大小。 - Philzen
显示剩余4条评论

8

64k是相当大的,如果超过了这个限制,你可能需要重新组织你的代码。

在我的项目中,我曾经在生成的源代码中遇到过这个限制。通过将一个方法拆分为几个方法来解决问题。


5

如果你的方法超过了50行,包括内部注释-请将其拆分。这样,即使存在限制,您也永远不会达到任何限制。

我个人见过1000行长的方法(由自称为程序员的罪犯编写:)),但没有看到这种类型的限制。


6
它最常见的情况有两种:(a) JSP,那就是我被绊倒的地方;以及(b)生成的代码。在这两种情况下,确保你的字节码始终低于64k可能需要大量工作。 - corlettk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接