java中方法的最大大小?

Reu*_*ben 26 java

我知道java中方法的最大大小是64k.如果它超过,我们将得到一个编译器警告,如"Code to large to compile".因此,我们可以用这么少的内存来称之为java的缺点.

我们可以增加这个尺寸限制还是真的可以增加?

关于这个方法大小的更多想法?

Pet*_*rey 37

根据我的经验,64KB限制只是生成代码的问题.ESP.在对大型数组进行实体化时(在代码中完成)

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

编辑:

JIT不会编译大于8 K的方法是没有价值的.这意味着代码运行速度较慢并且可能影响GC时间(因为使用非编译esp的方法搜索线程的调用堆栈效率较低)大的)

如果可能,您希望将方法限制为8 K而不是64 K.

  • +1:限制是生成代码的真正痛苦. (8认同)
  • 我已经看到人们使用JSP几次达到这个限制.默认情况下,JSP使用一个包含JSP中所有内容的大型doGet()方法编译为servlet.那些在一个页面中需要大量东西但是没有将JSP拆分成JSP片段的人似乎对此有所了解,因此它不仅仅是生成代码的问题. (4认同)
  • 有两个案例我曾经说过:一个是使用Java版本的YACC或LEX.它们可以生成在单个方法中实现的非常大的状态机.在尝试测量代码覆盖率时也会发生这种情况.coverage工具检测.class文件以及收集运行时数据所需的附加字节码.即使原始代码比这个小得多,检测字节码也可以推动超过64K限制的方法. (4认同)
  • 我的限制工作是为每N行生成的代码生成方法.然后用一种新方法调用它们. (3认同)
  • @Diederik很遗憾编译器不够聪明,不能为你做那个,或者那个字节码支持更大的方法. (2认同)

Ser*_*nov 7

64k是相当多的,如果你超过它,你可能会考虑重新组织你的代码.

在我的项目中,我在生成的源中遇到了这个约束.通过将一种方法分成几种来解决.


Ale*_*exR 5

如果您的方法超过 50 行(包括内部注释) - 将其拆分。在这种情况下,您将永远不会达到任何限制(即使存在)。

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

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