[英]Finding the Bytecode Size of a Java Method
I am trying to figure out the bytecode size of a method because I want to be sure that it will be small enough to be inlined by compiler optimizations.我试图找出一个方法的字节码大小,因为我想确保它足够小以被编译器优化内联。
I saw that the default max size for inlining methods is 35, so if the method is larger than that I will revise the code or break it into multiple methods.我看到内联方法的默认最大大小为 35,因此如果方法大于此值,我将修改代码或将其分解为多个方法。
I have a method that generates the bytecode below (disassembled via the ASM Bytecode Outline plugin for IntelliJ IDEA).我有一种生成以下字节码的方法(通过 IntelliJ IDEA 的 ASM 字节码大纲插件反汇编)。
How can I tell the bytecode size of that method?我如何知道该方法的字节码大小? the LINENUMBERs seem to reference the line numbers of the original source code.
LINENUMBER 似乎引用了原始源代码的行号。
public static mergeNativeArrays([Ljava/lang/Object;[Ljava/lang/Object;IZ)[Ljava/lang/Object;
L0
LINENUMBER 865 L0
ALOAD 0
ASTORE 4
L1
LINENUMBER 867 L1
ILOAD 2
IFGE L2
L3
LINENUMBER 868 L3
ALOAD 0
ARRAYLENGTH
ISTORE 2
L2
LINENUMBER 870 L2
FRAME APPEND [[Ljava/lang/Object;]
ILOAD 2
ALOAD 1
ARRAYLENGTH
IADD
ISTORE 5
L4
LINENUMBER 872 L4
ALOAD 4
ARRAYLENGTH
ILOAD 5
IF_ICMPGE L5
L6
LINENUMBER 874 L6
ILOAD 3
IFEQ L7
L8
LINENUMBER 875 L8
ILOAD 5
INVOKESTATIC railo/commons/math/MathUtil.nextPowerOf2 (I)I
ISTORE 5
L7
LINENUMBER 877 L7
FRAME APPEND [I]
ILOAD 5
ANEWARRAY java/lang/Object
ASTORE 4
L9
LINENUMBER 878 L9
ALOAD 0
ICONST_0
ALOAD 4
ICONST_0
ALOAD 0
ARRAYLENGTH
INVOKESTATIC java/lang/System.arraycopy (Ljava/lang/Object;ILjava/lang/Object;II)V
L5
LINENUMBER 881 L5
FRAME SAME
ALOAD 1
ICONST_0
ALOAD 4
ILOAD 2
ALOAD 1
ARRAYLENGTH
INVOKESTATIC java/lang/System.arraycopy (Ljava/lang/Object;ILjava/lang/Object;II)V
L10
LINENUMBER 883 L10
ALOAD 4
ARETURN
L11
LOCALVARIABLE dst [Ljava/lang/Object; L0 L11 0
LOCALVARIABLE src [Ljava/lang/Object; L0 L11 1
LOCALVARIABLE dstPosition I L0 L11 2
LOCALVARIABLE doPowerOf2 Z L0 L11 3
LOCALVARIABLE result [Ljava/lang/Object; L1 L11 4
LOCALVARIABLE newSize I L4 L11 5
MAXSTACK = 5
MAXLOCALS = 6
How can I tell the bytecode size of that method?
我如何知道该方法的字节码大小?
One way is to just add them up :-)一种方法是将它们加起来:-)
Each bytecode instruction consists of 1 byte for the primary instruction plus a fixed number of operand bytes.每个字节码指令由 1 个主指令字节加上固定数量的操作数字节组成。
A more practical way is to dump the classfile containing the bytecodes using javap -c
.更实用的方法是使用
javap -c
转储包含字节码的类文件。 The output includes byte offsets for each instruction.输出包括每条指令的字节偏移量。
Reference: http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javap.html参考: http : //docs.oracle.com/javase/7/docs/technotes/tools/windows/javap.html
1) I can add ALOAD 0 ASTORE 4 as 4 bytes, but what do I do with with ARRAYLENGTH or INVOKESTATIC method-name?
1) 我可以将 ALOAD 0 ASTORE 4 添加为 4 个字节,但是我如何处理 ARRAYLENGTH 或 INVOKESTATIC 方法名称?
The instructions are listed in Section 6.5 of the JVM spec - http://docs.oracle.com/javase/specs/jvms/se7/html/index.html JVM 规范的第 6.5 节中列出了这些说明 - http://docs.oracle.com/javase/specs/jvms/se7/html/index.html
Following this procedure, I deduced that ARRAYLENGTH is 1 byte, and INVOKESTATIC is 3 bytes.按照这个过程,我推断出 ARRAYLENGTH 是 1 个字节,INVOKESTATIC 是 3 个字节。
2) I tried to use javap but for some reason I get class not found (it's inside a jar and I passed -classpath filename.jar to javap but it didn't work).
2)我尝试使用 javap 但由于某种原因我找不到类(它在一个 jar 中,我将 -classpath filename.jar 传递给 javap 但它没有用)。
Read the javap
manual entry again.再次阅读
javap
手册条目。 It does work if you use it correctly.如果您正确使用它,它确实有效。 (Perhaps you didn't supply the fully-qualified classname in the correct format.)
(也许您没有以正确的格式提供完全限定的类名。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.