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