简体   繁体   English

查找 Java 方法的字节码大小

[英]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

  1. Scroll down to the relevant part of the index.向下滚动到索引的相关部分。
  2. Click on the link for the instruction.单击链接获取说明。
  3. Read the "format" and "description" to figure out how many bytes are used.阅读“格式”和“描述”以找出使用了多少字节。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM