【问题标题】:How to check bytecode length of java method如何检查java方法的字节码长度
【发布时间】:2018-01-19 22:19:42
【问题描述】:

此时,我参与了具有许多大型类和生成代码的大型遗留项目。 我希望找到所有字节码长度大于 8000 字节的方法(因为 OOTB java 不会优化它)。

我找到了这样的手动方式:How many bytes of bytecode has a particular method in Java? ,但是我的目标是自动扫描许多文件。

我尝试使用 jboss-javassist,但 AFAIK 获取字节码长度仅在类级别可用。

【问题讨论】:

    标签: java bytecode bytecode-manipulation jvm-bytecode


    【解决方案1】:

    然而,巨大的方法可能永远不会被内联,但我对 8000 的阈值表示怀疑。This comment 建议一个小得多的限制,尽管它取决于平台和配置。

    您是对的,获取字节码长度需要在低级别处理类,但是,您没有指定在尝试使用 Javassist 执行此操作时遇到的实际障碍。一个使用 Javassist 执行此操作的简单程序是

    try(InputStream is=javax.swing.JComponent.class.getResourceAsStream("JComponent.class")) {
        ClassFile​ cf = new ClassFile(new DataInputStream(is));
        for(MethodInfo mi: cf.getMethods()) {
            CodeAttribute ca = mi.getCodeAttribute();
            if(ca == null) continue; // abstract or native
            int bLen = ca.getCode().length;
            if(bLen > 300)
                System.out.println(mi.getName()+" "+mi.getDescriptor()+", "+bLen+" bytes");
        }
    }
    

    这是使用 API 中使用泛型的最新版本的 Javassist 编写和测试的。如果您有不同/旧版本,则必须使用

    try(InputStream is=javax.swing.JComponent.class.getResourceAsStream("JComponent.class")) {
        ClassFile​ cf = new ClassFile(new DataInputStream(is));
        for(Object miO: cf.getMethods()) {
            MethodInfo mi = (MethodInfo)miO;
            CodeAttribute ca = mi.getCodeAttribute();
            if(ca == null) continue; // abstract or native
            int bLen = ca.getCode().length;
            if(bLen > 300)
                System.out.println(mi.getName()+" "+mi.getDescriptor()+", "+bLen+" bytes");
        }
    }
    

    【讨论】:

    • 哦该死的今天的第二部分!你能找出这样的方法长度吗?抱歉,与 javaassist 的工作接近于零……该死,我可以用这个!!!
    • @Holder 谢谢你的例子和解释!老实说,我只是查看了教程:jboss-javassist.github.io/javassist/tutorial/tutorial.html,然后尝试用谷歌搜索其他选项,但没有成功。
    • 对,有时候,教程没有很好地涵盖一些东西,你必须浏览API(在本例中为this one)并希望找到灵感。无论如何,我很高兴能帮上忙。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 2018-11-13
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    • 2014-09-28
    • 2017-02-09
    相关资源
    最近更新 更多