Поиск кодовой базы для больших методов - PullRequest
4 голосов
/ 06 августа 2011

По умолчанию JIT HotSpot отказывается компилировать методы размером более 8 Кбайт-кода (1).Есть ли что-нибудь, что может сканировать банку для таких методов (2)?

  1. , если вы не передадите -XX:-DontCompileHugeMethods

  2. Джон Масамицу описывает, как интерпретируемые методы могут замедлять сбор мусора, и отмечает, чторефакторинг, как правило, мудрее, чем -XX:-DontCompileHugeMethods

Ответы [ 2 ]

1 голос
/ 24 мая 2013

Спасибо Питеру Лоури за указатель на ASM. Эта программа распечатывает размер каждого метода в банке:

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) {
            }
        }
    }
}
0 голосов
/ 06 августа 2011

Checkstyle , вероятно, было бы хорошо для этого - он не работает на пределе 8k, но количество исполняемых операторов в методе в целом. Честно говоря, это предел, который вы хотите на практике, хотя.

Как вы уже сказали, -XX:-DontCompileHugeMethods - это, как правило, плохая идея - она ​​заставляет JVM копаться во всем этом уродливом коде и пытаться что-то с ним сделать, что может отрицательно повлиять на производительность, а не на позитив! Рефакторинг, или, что еще лучше, не написание таких огромных для начала методов, - это путь вперед.

О, и если огромные методы в конечном итоге были сделаны с помощью какого-то человеческого дизайна, а не сгенерированного автоматически кода, то, возможно, в вашей команде есть люди, которым нужно поговорить ...

...