问题:我有一个方法可以编译成超过 8000 字节的 Java 字节码。HotSpot 有一个神奇的限制,使 JIT 不会为超过 8000 字节的方法启动。(是的,拥有一个巨大的方法是合理的。这是一个标记器循环。)该方法在一个库中,我不想要求该库的用户必须配置 HotSpot 才能停用魔法限制。
观察:反编译字节码表明 Eclipse Java 编译器生成了很多无意义的 goto。(javac 甚至更糟。)也就是说,有些 goto 只能通过跳转到达。显然,跳转到 goto 的跳转应该直接跳转到 goto 跳转的地方,并且 goto 应该被消除。
问题:是否有针对 Java 5 类文件的字节码优化器,它可以扁平化无意义的跳转链,然后删除不必要的 goto?
编辑:我的意思是这样的模式:
8698: goto 8548
8701: goto 0
显然,第二个 goto 只能通过跳转到 8701 来达到,这也可能是直接跳转到 0。
在第二次调查中,这种可疑的模式更为常见:
4257: if_icmpne 4263
4260: goto 8704
4263: aload_0
显然,人们希望编译器将“不等于”比较反转为“相等”比较,跳转到 8704 并消除 goto。