【问题标题】:Maximum size of a method in java?java中方法的最大大小?
【发布时间】:2011-07-04 10:39:49
【问题描述】:

我知道java中方法的最大大小是64k。如果超过,我们会得到一个编译器警告,比如“代码太大而无法编译”。那么我们可以将这称为 java 的内存量很小的缺点吗?

我们可以增加这个大小限制还是真的可以增加?

关于这个方法的大小还有什么想法吗?

【问题讨论】:

  • (a) 你在哪里读到这个? (b) 为什么重要?
  • 这个限制应该设置为 2k,以强制重构和漂亮的设计 :) 就像 255 个方法参数的限制应该设置为 10。
  • 并且 (b) 如果您的代码对于单个方法大于 64kb...也许是时候重构了?
  • @Lukas Eder - 正是我的想法,缺点是它太多了:)
  • @Max:预编译器将代码拆分为两种方法非常简单

标签: java


【解决方案1】:

根据我的经验,64KB 限制只是生成代码的问题。尤其是初始化大型数组时(在代码中完成)

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

编辑:

JIT 不会编译大于 8 K 的方法毫无价值。这意味着代码运行速度较慢并且会影响 GC 时间(因为使用以下方法搜索线程的调用堆栈效率较低)未编译,尤其是大的)

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

【讨论】:

  • 我的解决方法是为每 N 行生成的代码生成方法。然后在一个新方法中调用它们。
  • @Diederik 可惜编译器不够聪明,无法为您做到这一点,或者字节码支持更大的方法。
  • 查看我的编辑建议您将方法限制为 8 K 或更少。
  • 我已经看到人们多次使用 JSP 达到这个限制。默认情况下,JSP 使用一个巨大的 doGet() 方法编译为 servlet,该方法包含 JSP 中的所有内容。在一页中需要很多东西但没有将 JSP 拆分为 JSP 片段的人似乎遇到了这个问题,因此这不仅是生成代码的问题。
  • 有两种情况让我感到厌烦:一种是使用 Java 版本的 YACC 或 LEX。它们可以生成以单一方法实现的非常大的状态机。在尝试测量代码覆盖率时也会发生这种情况。覆盖工具使用收集运行时数据所需的额外字节码来检测 .class 文件。检测字节码可以将方法推送到超过 64K 的限制,即使原始代码比这小很多。
【解决方案2】:

64k 相当多,如果超过它,您可能会考虑重新组织代码。

在我的项目中,我曾在生成的源代码中遇到过这个限制。只需将一种方法拆分为多种即可解决。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 它最常见的情况有两种:(a)JSP,这是我绊倒它的地方; (b) 生成的代码。在这两种情况下,确保您的字节码始终低于 64k 可能需要大量工作。
    猜你喜欢
    • 1970-01-01
    • 2019-04-18
    • 2012-03-03
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 2015-11-18
    • 2023-03-12
    相关资源
    最近更新 更多