【问题标题】:Search a codebase for large methods在代码库中搜索大型方法
【发布时间】:2011-08-05 23:14:19
【问题描述】:

默认情况下,HotSpot JIT 拒绝编译大于大约 8k 字节码的方法 (1)。有什么可以扫描罐子的方法(2)吗?

  1. 除非你通过-XX:-DontCompileHugeMethods

  2. Jon Masamitsu 描述了解释方法如何减慢垃圾收集速度,并指出重构通常比-XX:-DontCompileHugeMethods 更明智

【问题讨论】:

  • 我可以肯定地看到即将到来的 cmets 为什么你的代码不应该有这么大的方法。然而,我确信有种合法的方式最终会出现如此大的方法(如自动生成的状态机代码等)。顺便说一句,为什么你的代码中有这么大的方法?
  • 我们的一些代码已经存在了 40 年,并且拥有一百位或更多作者……不知道某些人的想法! (很明显,15 岁以上的 Java 最初是用其他语言编写的。)如果有超过 8k 限制的深黑色很少访问的角落,那么它们可以留下来。但是我想知道关键路径上是否有任何东西> 8k,如果它在未来潜入> 8k,如果我正在重构,我想知道我什么时候(足够远)低于8k。
  • 可以使用javap、ASM等工具获取方法的字节长度

标签: java jit


【解决方案1】:

感谢 Peter Lawrey 提供指向 ASM 的指针。该程序打印出 jar 中每个方法的大小:

import org.objectweb.asm.ClassReader;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.MethodNode;

public static void main(String[] args) throws IOException {
    for (String filename : args) {
        System.out.println("Methods in " + filename);
        ZipFile zip = new ZipFile(filename);
        Enumeration<? extends ZipEntry> it = zip.entries();
        while (it.hasMoreElements()) {
            InputStream clazz = zip.getInputStream(it.nextElement());
            try {
                ClassReader cr = new ClassReader(clazz);
                ClassNode cn = new ClassNode();
                cr.accept(cn, ClassReader.SKIP_DEBUG);
                List<MethodNode> methods = cn.methods;
                for (MethodNode method : methods) {
                    int count = method.instructions.size();
                    System.out.println(count + " " + cn.name + "." + method.name);
                }
            } catch (IllegalArgumentException ignored) {
            }
        }
    }
}

【讨论】:

  • 我继续并根据自己的需要对其进行了修改 - 排序!这是代码的链接:paste.ubuntu.com/6095725 如果有人愿意,请随时编辑。
  • @Riking 我和你的程序计算指令; this question 指出字节码每条指令多于一个字节。查看每条指令的大小似乎并非易事。
  • 我已经注意到了,但是!限制是 8K 字节码 指令,而不是字节! - 这是这里计算的。所以这甚至没有必要。
【解决方案2】:

Checkstyle 可能对此有好处 - 它不适用于 8k 限制,但一般来说方法中可执行语句的数量。老实说,这是您在实践中想要的限制。

正如您已经说过的,-XX:-DontCompileHugeMethods 通常是一个坏主意 - 它迫使 JVM 挖掘所有丑陋的代码并尝试对其进行处理,这可能会对性能产生负面影响,而不是正面影响!重构,或者最好还是不要编写庞大的方法,这将是前进的方向。

哦,如果这些巨大的方法最终是通过一些人工设计而不是自动生成的代码来实现的,那么您的团队中可能有些人需要与之交谈...

【讨论】:

    猜你喜欢
    • 2015-03-10
    • 2013-11-26
    • 2012-09-19
    • 2010-11-03
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多