在代码库中搜索大型方法

时间:2011-08-05 23:14:19

标签: java jit

默认情况下,HotSpot JIT拒绝编译大于8k字节码(1)的方法。是否有任何东西可以扫描罐子的方法(2)?

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

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

  3. 更明智

2 个答案:

答案 0 :(得分: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) {
            }
        }
    }
}

答案 1 :(得分:0)

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

正如您已经说过的那样,-XX:-DontCompileHugeMethods通常是一个坏主意 - 它迫使JVM挖掘所有丑陋的代码并尝试用它做一些事情,这会对性能产生负面影响而不是积极影响一!重构,或者更好的是仍然没有编写那些重要的方法,这将是前进的方向。

哦,如果那些巨大的方法通过一些人工设计而不是自动生成的代码结束,那么你团队中可能会有一些人需要和...进行交谈......