事先创建一个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