ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

方法区使用举例

2021-07-11 18:58:58  阅读:209  来源: 互联网

标签:lang 操作数 java PrintStream Utf8 举例 io 使用 方法


一 代码

public class MethodAreaDemo {
    public static void main(String args[]) {
        int x = 500;
        int y = 100;
        int a = x / y;
        int b = 50;
        System.out.println(a+b);
    }
}

二 对应常量池

#1 = Methodref          #5.#24         // java/lang/Object."<init>":()V
#2 = Fieldref           #25.#26        // java/lang/System.out:Ljava/io/PrintStream;
#3 = Methodref          #27.#28        // java/io/PrintStream.println:(I)V
#4 = Class              #29            // com/atguigu/java1/MethodAreaDemo
#5 = Class              #30            // java/lang/Object
#6 = Utf8               <init>
#7 = Utf8               ()V
#8 = Utf8               Code
#9 = Utf8               LineNumberTable
#10 = Utf8               LocalVariableTable
#11 = Utf8               this
#12 = Utf8               Lcom/atguigu/java1/MethodAreaDemo;
#13 = Utf8               main
#14 = Utf8               ([Ljava/lang/String;)V
#15 = Utf8               args
#16 = Utf8               [Ljava/lang/String;
#17 = Utf8               x
#18 = Utf8               I
#19 = Utf8               y
#20 = Utf8               a
#21 = Utf8               b
#22 = Utf8               SourceFile
#23 = Utf8               MethodAreaDemo.java
#24 = NameAndType        #6:#7          // "<init>":()V
#25 = Class              #31            // java/lang/System
#26 = NameAndType        #32:#33        // out:Ljava/io/PrintStream;
#27 = Class              #34            // java/io/PrintStream
#28 = NameAndType        #35:#36        // println:(I)V
#29 = Utf8               com/atguigu/java1/MethodAreaDemo
#30 = Utf8               java/lang/Object
#31 = Utf8               java/lang/System
#32 = Utf8               out
#33 = Utf8               Ljava/io/PrintStream;
#34 = Utf8               java/io/PrintStream
#35 = Utf8               println
#36 = Utf8               (I)V

三 字节码执行过程展示

1 执行前,方法区、虚拟机栈以及程序计数器的样子

2 将操作数 500 放入到操作数栈中。

3 弹出操作数栈栈顶 500,保存到本地变量表1。

4 把 100 这个数值压入操作数栈

5 弹出操作数栈栈顶 100,保存到本地变量表2。

6 读取本地变量1压入操作数栈

7 读取本地变量2压入操作数栈

8 将栈顶两个 int 类型取出并相除,结果5入栈。

9 将5保存到本地变量3,然后将50压入操作数栈

10 将栈顶 int 类型值保存到局部变量表4中。

11 获取类或接口字段的值并将其压入操作数栈

#2 在常量池经过一番拼接,最终拼接成: java/lang/System.out:Ljava/io/PrintStream,它是Fieldref 类型。

12 将本地变量3取出,压入操作数栈。

13 将本地变量4取出,压入操作数栈。

14 将栈顶两个 int 类型取出并相加,结果55入栈。

15 调用 invokevirtual #3 #3 = Methodref          #27.#28        // java/io/PrintStream.println:(I)V

16 main方法执行结束,进行 return

整个过程中,程序计数器始终计算的都是当前代码运行的位置,目的是为了方便记录方法调用后能够正常返回,或者是进行了 CPU 切换后,也能回来到原来的代码进行 执行。

标签:lang,操作数,java,PrintStream,Utf8,举例,io,使用,方法
来源: https://blog.csdn.net/chengqiuming/article/details/118657805

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有