如何检查java方法的字节码长度

2024-04-21

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

我发现这样的手动方式:Java 中的特定方法有多少字节的字节码? https://stackoverflow.com/questions/11345034/how-many-bytes-of-bytecode-has-a-particular-method-in-java,但是我的目标是自动扫描许多文件。

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


然而,巨大的方法可能确实永远不会被内联,但我对 8000 的阈值持怀疑态度。这条评论 https://stackoverflow.com/questions/18737774/hotspot-jit-inlining-strategy-top-down-or-down-top/18741113#comment27623635_18741113建议一个更小的限制,尽管它无论如何都依赖于平台和配置。

您是对的,获取字节码长度需要在较低级别上处理类,但是,您没有指定在尝试使用 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");
    }
}

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

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");
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何检查java方法的字节码长度 的相关文章

随机推荐

  • 使用代码将 X509 证书添加到存储区

    此代码会将 x509 cer 证书文件添加到证书存储中 使用System Security Cryptography X509Certificates var filename Cert cer var cert new X509Certi
  • Selenium 服务器错误:无法获取浏览器

    我在 Windows 7 上运行 Selenium Standalone Server 2 25 并使用 Internet Explorer 9 作为浏览器 对于每个需要打开浏览器的测试 我都会收到此错误 Selenium WebDrive
  • 在复合组件的属性中使用EL

    我的 JSF 自定义组件代码
  • 在 Jest .toMatchObject 中包含 toBeCloseTo

    我正在测试一个对象是否与一组字段匹配 但其中一个是浮点 我需要使用 toBeClearTo https jestjs io docs en next expect tobeclosetonumber numdigits 怎么可能在一段时间之
  • r 中不包括 NA 的列长度

    假设我有一个data frame如下 a b c 1 5 NA 6 2 NA NA 7 3 6 5 8 我想找到每列的长度 不包括 NA 答案应该是这样的 a b c 2 1 3 到目前为止 我已经尝试过 is na Gives TRUE
  • Excel公式从日期中减去天数

    Excel中有没有办法让公式执行如下操作 12 20 2010 180 这需要特定日期 本例中为 12 20 2010 并减去 180 天 假设原始日期位于单元格 A1 中 DATE YEAR A1 MONTH A1 DAY A1 180
  • 为什么 jquery 脚本不工作?

    为什么 jQuery 脚本可以在我的 jsfiddle 中运行 但不能在我的页面中运行 我所做的 尝试了不同版本的 JQuery 制作了脚本 所以我有这个测试页面 头部部分
  • 如何使用 Xcode 5 本地化我的应用程序?

    这是关于的后续问题 和答案 如何使用 Xcode 4 本地化我的应用程序 https stackoverflow com questions 5349066 how to localize my app with xcode 4 11282
  • Angular 2:实现自定义上下文菜单

    我正在实现 Angular 2 属性指令 以允许我向元素添加自定义上下文菜单 如下所示 p Hello world p 该指令添加了一个鼠标事件处理程序来捕获右键单击 其想法是构建一个上下文菜单 将其添加到 DOM 然后在用户完成操作时销毁
  • Clojure gen-class 返回自己的类

    我现在正在使用 Clojure 创建一个类对象 它有一个返回对象本身的方法 用Java编写的 我想要制作的对象是这样的 class Point public double x public double y public Point dou
  • 静态与非静态方法

    假设您有一些可以在非静态类中设为静态的方法 例如 private double power double a double b return Math Pow a b 您认为将方法签名更改为静态有什么好处吗 在上面的例子中 private
  • docker-compose 相当于 docker run --init 吗?

    根据https github com krallin tini using tini https github com krallin tini using tini tini内置于docker中 可以通过传递 init标记为docker
  • docker 容器中 PostgreSQL 的权限问题

    我正在尝试使用 PostgreSQL 运行一个 docker 映像 该映像配置了一个用于持久数据的卷 docker compose yml version 3 1 services db image postgres restart alw
  • 启动 StepFunction 并退出不会触发执行

    我有 Lambda 函数tranportKickoff它接收输入 然后将输入发送 代理到阶跃函数 下面的代码does运行 我没有收到任何错误 但同时步骤函数没有执行 对于设计也很重要 我不希望transportKickoff函数等待步骤函数
  • Mongoose Population: CastError: 路径“_id”处的值“[object Object]”转换为 ObjectId 失败

    遇到一个CastError在 Mongoose 中填充嵌套 ObjectId 引用时 值 显然是valid 只要它们在保存到架构时不会被阻止 有兴趣在服务器端解决此问题以防止将来出现格式错误的数据 但是 我知道不从客户端保存这些值是一个好主
  • java 是否存在只有键没有值的哈希结构?

    我正在寻找一种无需值即可对键进行哈希处理的结构 查询时 如果找到密钥 则应返回 true 否则返回 false 我正在寻找类似的东西Hashtable
  • 获取符合条件的组合

    问题 我有一个表 我需要在其中提取行 或列 如果我转置表 的所有有效组合 列中只有值 或 并且当组合中的至少一行中有 时 组合被认为是有效的 也就是说 所有行中带有 的任何组合都是无效的 示例表 Guns P 01 P 02 P 03 P
  • React 路由器匹配失败

    使用有什么好处Match and Miss组件来自react router over Router成分 我似乎找不到任何关于此的文档反应路由器文档 https github com ReactTraining react router tr
  • R外部接口

    我想实现一些用 C 代码编写的 R 包 C 代码必须 将数组 任何类型 作为输入 生成数组作为输出 大小不可预测 实现数组传递的最佳实践是什么 目前 C 代码被调用 C 它通过指针直接从 R 访问数组 不幸的是 无法对输出执行相同的操作 因
  • 如何检查java方法的字节码长度

    目前 我参与了一个大型遗留项目 其中包含许多巨大的类和生成的代码 我希望找到所有字节码长度大于 8000 字节的方法 因为 OOTB java 不会优化它 我发现这样的手动方式 Java 中的特定方法有多少字节的字节码 https stac