Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 搜索大型方法的代码库_Java_Jit - Fatal编程技术网

Java 搜索大型方法的代码库

Java 搜索大型方法的代码库,java,jit,Java,Jit,默认情况下,HotSpot JIT拒绝编译大于8k字节码(1)的方法。是否有任何东西可以扫描一个jar以查找此类方法(2)? 除非您通过了-XX:-DontCompileHugeMethods 描述解释方法如何降低垃圾收集的速度,并指出重构通常比-XX:-DontCompileHugeMethods 这可能会有好处——它在8k限制下不起作用,但在一个方法中可执行语句的数量通常是有限的。老实说,这是一个限制,但你想在实践中 正如您已经指出的那样,-XX:-DontCompileHugeMetho

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

  • 除非您通过了
    -XX:-DontCompileHugeMethods

  • 描述解释方法如何降低垃圾收集的速度,并指出重构通常比
    -XX:-DontCompileHugeMethods

  • 这可能会有好处——它在8k限制下不起作用,但在一个方法中可执行语句的数量通常是有限的。老实说,这是一个限制,但你想在实践中

    正如您已经指出的那样,
    -XX:-DontCompileHugeMethods
    通常是一个坏主意-它迫使JVM挖掘所有难看的代码,并尝试对其进行处理,这可能会对性能产生负面影响,而不是正面影响!重构,或者更好的做法是不要编写如此庞大的方法


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

    多亏了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) {
                }
            }
        }
    }
    
    import org.objectweb.asm.ClassReader;
    导入org.objectweb.asm.tree.ClassNode;
    导入org.objectweb.asm.tree.MethodNode;
    公共静态void main(字符串[]args)引发IOException{
    用于(字符串文件名:args){
    System.out.println(“方法输入”+文件名);
    ZipFile zip=新ZipFile(文件名);
    
    Enumeration我肯定会看到关于为什么你的代码不应该有这么大的方法的评论。但是我肯定有合法的方法最终会有这么大的方法(比如自动生成的状态机代码等等).Btw,为什么在你的代码中有这么大的方法?我们的一些代码已经存在了40年,有100多位作者……很难说有些人的想法是什么!(显然,Java>15岁的版本最初是用其他语言编写的。)如果有深度黑暗很少访问的角落超过了8k限制,那么他们可以留下来。但是我想知道关键路径上的任何东西是否>8k,未来是否会悄悄上升>8k,如果我正在重构,我想知道何时(足够远)8k以下。您可以使用javap和ASM等工具获取Method的字节长度。我根据自己的需要对其进行了修改-排序!下面是代码链接:如果有人愿意,请随意编辑。@Riking my program and yours count the instructions;指出字节码每个指令有一个以上的字节。查找si每一条指令的大小似乎并不微不足道。我已经注意到了,但是!限制是8K字节码指令,而不是字节!-这是这里计算的。所以这甚至不是必要的。