默认情况下,HotSpot JIT拒绝编译大于8k字节码(1)的方法。是否有任何东西可以扫描罐子的方法(2)?
除非您通过-XX:-DontCompileHugeMethods
Jon Masamitsu描述了解释方法如何减慢垃圾收集,并指出重构通常比-XX:-DontCompileHugeMethods
答案 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挖掘所有丑陋的代码并尝试用它做一些事情,这会对性能产生负面影响而不是积极影响一!重构,或者更好的是仍然没有编写那些重要的方法,这将是前进的方向。
哦,如果那些巨大的方法通过一些人工设计而不是自动生成的代码结束,那么你团队中可能会有一些人需要和...进行交谈......