首页 > 其他 > 详细

字节码指令以及操作数栈的分析

时间:2019-10-23 10:41:24      阅读:146      评论:0      收藏:0      [点我收藏+]

事先创建一个java类,如下:

package com.yang.jvm;

public class Demo {

    public int getNum(){
        int a=1;
        int b=2;
        int c=3;
        int d=4;
        return (a+b-c)*d;
    }
}

在命令窗口输入:F:\jvmdemo>javap -c -verbose build/classes/java/main/com/yang/jvm/Demo.class
技术分享图片

 


执行命令后获得字节码文件内容:

Classfile /F:/jvmdemo/build/classes/java/main/com/yang/jvm/Demo.class
  Last modified 2019-10-23; size 428 bytes
  MD5 checksum b4f01d8c01f685e501ee4f8dc209652d
  Compiled from "Demo.java"
public class com.yang.jvm.Demo
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #3.#20         // java/lang/Object."<init>":()V
   #2 = Class              #21            // com/yang/jvm/Demo
   #3 = Class              #22            // java/lang/Object
   #4 = Utf8               <init>
   #5 = Utf8               ()V
   #6 = Utf8               Code
   #7 = Utf8               LineNumberTable
   #8 = Utf8               LocalVariableTable
   #9 = Utf8               this
  #10 = Utf8               Lcom/yang/jvm/Demo;
  #11 = Utf8               getNum
  #12 = Utf8               ()I
  #13 = Utf8               a
  #14 = Utf8               I
  #15 = Utf8               b
  #16 = Utf8               c
  #17 = Utf8               d
  #18 = Utf8               SourceFile
  #19 = Utf8               Demo.java
  #20 = NameAndType        #4:#5          // "<init>":()V
  #21 = Utf8               com/yang/jvm/Demo
  #22 = Utf8               java/lang/Object
{
  public com.yang.jvm.Demo();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 3: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       5     0  this   Lcom/yang/jvm/Demo;

  public int getNum();
    descriptor: ()I
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=5, args_size=1
         0: iconst_1
         1: istore_1
         2: iconst_2
         3: istore_2
         4: iconst_3
         5: istore_3
         6: iconst_4
         7: istore        4
         9: iload_1
        10: iload_2
        11: iadd
        12: iload_3
        13: isub
        14: iload         4
        16: imul
        17: ireturn
      LineNumberTable:
        line 6: 0
        line 7: 2
        line 8: 4
        line 9: 6
        line 10: 9
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      18     0  this   Lcom/yang/jvm/Demo;
            2      16     1     a   I
            4      14     2     b   I
            6      12     3     c   I
            9       9     4     d   I
}
SourceFile: "Demo.java"

F:\jvmdemo>javap -c -verbose build/classes/java/main/com/yang/jvm/Demo.class
Classfile /F:/jvmdemo/build/classes/java/main/com/yang/jvm/Demo.class
  Last modified 2019-10-23; size 428 bytes
  MD5 checksum b4f01d8c01f685e501ee4f8dc209652d
  Compiled from "Demo.java"
public class com.yang.jvm.Demo
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #3.#20         // java/lang/Object."<init>":()V
   #2 = Class              #21            // com/yang/jvm/Demo
   #3 = Class              #22            // java/lang/Object
   #4 = Utf8               <init>
   #5 = Utf8               ()V
   #6 = Utf8               Code
   #7 = Utf8               LineNumberTable
   #8 = Utf8               LocalVariableTable
   #9 = Utf8               this
  #10 = Utf8               Lcom/yang/jvm/Demo;
  #11 = Utf8               getNum
  #12 = Utf8               ()I
  #13 = Utf8               a
  #14 = Utf8               I
  #15 = Utf8               b
  #16 = Utf8               c
  #17 = Utf8               d
  #18 = Utf8               SourceFile
  #19 = Utf8               Demo.java
  #20 = NameAndType        #4:#5          // "<init>":()V
  #21 = Utf8               com/yang/jvm/Demo
  #22 = Utf8               java/lang/Object
{
  public com.yang.jvm.Demo();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 3: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       5     0  this   Lcom/yang/jvm/Demo;

  public int getNum();
    descriptor: ()I
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=5, args_size=1
         0: iconst_1
         1: istore_1
         2: iconst_2
         3: istore_2
         4: iconst_3
         5: istore_3
         6: iconst_4
         7: istore        4
         9: iload_1
        10: iload_2
        11: iadd
        12: iload_3
        13: isub
        14: iload         4
        16: imul
        17: ireturn
      LineNumberTable:
        line 6: 0
        line 7: 2
        line 8: 4
        line 9: 6
        line 10: 9
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      18     0  this   Lcom/yang/jvm/Demo;
            2      16     1     a   I
            4      14     2     b   I
            6      12     3     c   I
            9       9     4     d   I
}
SourceFile: "Demo.java"

 本次需要分析的字节码内容如下:

技术分享图片

 

 java虚拟机栈和栈帧关系图:

技术分享图片

 

 由字节码文件可以看到,栈深度为2(stack=2),

 

 

字节码指令以及操作数栈的分析

原文:https://www.cnblogs.com/yangxiaohui227/p/11724828.html

(1)
(1)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!