zoukankan      html  css  js  c++  java
  • 方法的执行过程

    接昨天的文章顺便理一理方法的执行过程,这里借许令波大牛的图一用

    方法执行之前

    调用昨天的run工具,完成了目标源码的编译后;获取ClassLoader对象,加载目标字节码至方法区,在堆上创建Class< T >对象并初始化(总之对象就是一种有场景的半持久型数据)。

    方法的执行过程

    调用对象的方法,开始执行方法区指令,根据该方法的操作数栈深度,局部变量空间需求等在该线程栈上创建栈帧,执行单个方法的过程其实就是在栈帧中操作的过程;调用下一个方法,那么就重复之前创建栈帧的步骤。

    下面列出一个方法的字节码,不难想象方法指令的执行过程

    public int calc() {
    		int a = 100;
    		int b = 200;
    		int c = 300;
    		return (a + b) * c;
    	}
    
    public int calc();
        descriptor: ()I
        flags: ACC_PUBLIC
        Code:
          stack=2, locals=4, args_size=1  //操作数栈深度为2,局部变量空间为4个Slot 
             0: bipush        100
             2: istore_1
             3: sipush        200
             6: istore_2
             7: sipush        300
            10: istore_3
            11: iload_1
            12: iload_2
            13: iadd
            14: iload_3
            15: imul
            16: ireturn
          LineNumberTable:
            line 3: 0
            line 4: 3
            line 5: 7
            line 6: 11
    
    

    抽象理解方法执行

    就我而言,在抽象理解方法的执行上,会把栈帧转移到相应的对象上,没错就如下图

    方法的执行一下变得好简单哈




  • 相关阅读:
    获取yyyymmdd hh:ii:ss形式的日期时间
    详解SQL Server如何链接远程MySQL
    SET QUERY_GOVERNOR_COST_LIMIT
    STR函数将数字数据转换成字符数据
    表的转置
    C#中时间的Ticks属性
    创建CheckBox样式的下拉列表
    HTML DOM whiteSpace 属性
    TRUNCATE TABLE
    NFS服务配置.
  • 原文地址:https://www.cnblogs.com/zzzz76/p/8159463.html
Copyright © 2011-2022 走看看