简单解析java方法在调用在内存中的执行过程

目录
  • 一.前提
    • 1.栈的内存原理图
    • 2.JVM是怎么运行方法的???
  • 二.调用(执行)过程
    • 1.方法调用时的规则
    • 2.示例代码
    • 3.整个程序的方法调用的过程图
    • 4.示例代码运行截图

一.前提

1.栈的内存原理图

2.JVM是怎么运行方法的???

  • 1.在运行阶段的时候,classLoader类加载器会把class文件中方法对应的代码片段放入内存区中的方法区中,以便于下次调用方法时,还能使用该方法。
  • 2.JVM在运行过程中,会把方法里面的代码块按照方法调用的先后顺序压栈入内存中的栈空间,按照方法里语句的执行顺序(从上到下,从里到外)去进行弹栈与运行操作

二.调用(执行)过程

1.方法调用时的规则

方法首次调用时,会通过类加载器将方法的对应的代码块加载到内存中方法区

每次调用方法时相当于一次压栈过程,当方法里面的语句全部执行完毕,就会把该方法进行弹栈操作(若不弹栈的话,到某个时候必会产生堆栈溢出异常)

2.示例代码

public class Practice {
    public static void main(String[] args) {
        System.out.println("main 开始");
        show1();
        System.out.println("main 结束");
    }
    public static void show1(){
        System.out.println("show1 开始");
        show2();
        System.out.println("show1 结束");
    }
    public static void show2(){
        System.out.println("show2 开始");
        System.out.println("show2 结束");
    }
}

3.整个程序的方法调用的过程图

3.1 JVM会自动调用main方法,因此main方法首先压栈,然后依次执行main方法里面的语句

3.2 当遇到show1()方法时,会把show1()方法压栈,并去执行show1方法里面的语句

3.3 执行show1方法里面的语句时,当执行到show2()时,show1方法暂停,然后对show2方法压栈,然后执行show2方法的内容

3.4 当执行完show2方法里面的内容时,会对show2方法进行弹栈,返回至show1方法中调用show2方法的位置,若没有对返回值有赋值操作,就会去执行后面的语句

3.5 执行完show1方法后会对show1方法进行弹栈,返回show1方法调用处的位置,然后去执行show1方法调用处以及后面的语句

4.示例代码运行截图

到此这篇关于简单解析java方法在调用在内存中的执行过程 的文章就介绍到这了,更多相关java方法调用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java 带参数与带返回值的方法的定义和调用

    目录 带参数方法的定义和调用 形参和实参 带参数方法练习 带返回值的方法的定义和调用 带返回值的方法定义 带返回值的方法调用 带参数方法的定义和调用 形参和实参 形参:方法定义中的参数 相当于变量定义格式,例int number 实参:方法调用中参数 等同于变量或常量,例如10   , number 带参数方法练习 需求: 设计一个方法用于打印两个数中最大数,数据来自于方法参数 思路: 1.定义一个方法,用于打印两个书中的最大数,例如getMax() public static void get

  • 详解Java方法method的定义与调用及重载

    目录 方法的定义和调用 什么是方法 方法的声明格式 方法的调用方式 方法的详细说明 总结 方法的重载 什么是方法重载 构成方法重载的条件 总结 方法的定义和调用 什么是方法 方法(method)就是一段用来完成特定功能的代码片段,类似于其它语言的函数(function). 方法用于定义该类或该类的实例的行为特征和功能实现. 方法是类和对象行为特征的抽象.方法很类似于面向过程中的函数.面向过程中,函数是最基本单位,整个程序由一个个函数调用组成.面向对象中,整个程序的基本单位是类,方法是从属于类和对

  • Java对象方法的调用执行过程详解

    目录 对象方法的调用执行过程 调用方法的几种方式 第一种 第二种 第三种 对象方法的调用执行过程 编译器查看对象的声明类型和方法名.假设调用x.f(param),隐式参数为x声明为C类对象,需要注意的是,有可能存在多个方法名为f,但是参数不同的方法,此时,编译器会一一列举C类中的所有方法名为f的方法和超类中访问属性为public的并且名字为f的方法. 接下来,编译器将查看调用方法时提供的参数类型.如果在所有名为f的方法中存在一个与提供的参数类型完全匹配,就选择这个方法,这个过程叫做“重载解析”.

  • Java多线程异步调用性能调优方法详解

    目录 概述 同步调用和异步调用 Future类图 Future的不足 代码 代码地址 Test PaymentService CheckService OrderService 总结 概述 大型电商公司的支付聚合服务都有这类的场景: 调用校验服务校验待生成的订单是否合法 订单服务生成订单(校验服务和订单服务没有依赖关系) 调用1和2,支付服务实现支付核心的功能 结合步骤1至3完成支付服务的聚合调用 ​假如步骤1的耗时5秒,步骤2的耗时3秒,步骤3的耗时2秒,如果你是架构师,要求:​ 1.请实现微

  • java反射调用方法NoSuchMethodException的解决方案

    目录 java反射调用方法NoSuchMethodException NoSuchMethodException问题总结 1.编译异常,这个很容易发现并解决 2.编译正常,运行报错 java反射调用方法NoSuchMethodException 1.方法定义成 public类型. 2.getMethod传参要正确 比如调用定义的:public void   show(Object obj) 要这样调用   clazz.getMethod("show",Object.class);而不是

  • Java多线程run方法中直接调用service业务类应注意的问题及解决

    目录 多线程run方法中直接调用service业务类应注意 图解如下 多线程知识点 线程启动的四种方式 使用@Aysnc注解实现多线程 用户线程与守护线程的区别 线程的六种状态 Java锁的可重入性 线程池的四种拒绝策略 sleep和wait的区别 为什么wait(),notify(),notifyAll()在对象中,而不在Thread类中 多线程run方法中直接调用service业务类应注意 Java多线程run方法里边使用service业务类会产生java.lang.NullPointerE

  • Java方法调用解析静态分派动态分派执行过程

    方法调用 在程序运行时,进行方法调用是最普遍,最频繁的操作 方法调用不等于方法执行: 方法调用阶段唯一的任务就是确定被调用的方法版本,即调用哪一个方法 不涉及方法内部的具体运行过程 Class文件的编译过程不包括传统编译中的连接步骤 Class文件中的一切方法调用在Class文件里面存储的都是符号引用,而不是方法在在实际运行时内存布局中的入口地址,即之前的直接引用: 这样使得Java具有更强大的动态扩展能力 同时也使得Java方法调用过程变得相对复杂 需要在类加载期间,甚至会到运行期间才能确定目

  • java调用WebService服务的四种方法总结

    目录 一.前言 二.简介   三.具体解析 第一种方式,首先得下载axis2的jar包,Axis2提供了一个wsdl2java.bat命令可以根据WSDL文件自动产生调用WebService的代码. 第二种RPC 方式,强烈推荐. 第三种:利用HttpURLConnection拼接和解析报文进行调用. 第四种,利用httpclient 总结 一.前言 本来不想写这个的,因为网上类似的是在是太多了.但是想想自己前面段时间用过,而且以后可能再也没机会用了.所以还是记录一下吧.我这儿是以C语言生成的W

  • java异步调用的4种实现方法

    目录 一.利用多线程 直接new线程 使用线程池 二.采用Spring的异步方法去执行(无返回值) @Async注解可以用在方法上,也可以用在类上,用在类上,对类里面所有方法起作用 三.采用Spring的异步方法+Future接收返回值 如果调用之后接收返回值,不对返回值进行操作则为异步操作,进行操作则转为同步操作,等待对返回值操作完之后,才会继续执行主进程下面的流程 四.原生Future方法 参考 一.利用多线程 直接new线程 Thread t = new Thread(){ @Overri

  • 简单解析java方法在调用在内存中的执行过程

    目录 一.前提 1.栈的内存原理图 2.JVM是怎么运行方法的??? 二.调用(执行)过程 1.方法调用时的规则 2.示例代码 3.整个程序的方法调用的过程图 4.示例代码运行截图 一.前提 1.栈的内存原理图 2.JVM是怎么运行方法的??? 1.在运行阶段的时候,classLoader类加载器会把class文件中方法对应的代码片段放入内存区中的方法区中,以便于下次调用方法时,还能使用该方法. 2.JVM在运行过程中,会把方法里面的代码块按照方法调用的先后顺序压栈入内存中的栈空间,按照方法里语

  • Java方法递归调用实例解析

    这篇文章主要介绍了Java方法递归调用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 /* 关于方法的递归调用 1.什么是递归? -方法自身调用自身 a(){ a(){ } } 2.递归是很耗费栈内存的,递归算法可以不用的时候尽量不用 3.一下程序运行的时候发生了这样一个错误[不是异常,是错误Error]: java.lang.StackOverflowErroe 栈内存溢出错误. 错误放生无法挽回,只有一个结果,就是JVM停止工作 4

  • 简单了解Java方法的定义和使用实现详解

    这篇文章主要介绍了简单了解Java方法的定义和使用实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.概念 Java语言中的"方法"(Method)在其他语言当中也可能被称为"函数"(Function).对于一些复杂的代码逻辑,如果希望重复使用这些代码,并且做到"随时任意使用",那么就可以将这些代码放在一个大括号"{}"当中,并且起一个名字.使用代码的时候,直接找到名

  • 简单了解Java方法的定义和使用实现

    目录 什么是方法? 方法的定义 2021.6.2 方法的重载(重要笔试可能遇到) 命令行传参 2021.6.3可变参数(也叫不定项参数) 递归(重要,不推荐使用) 2021.6.5什么是数组 数组声明创建 2021.6.6 内存分析(重要) Java内存分析 2021.6.7数组的使用 二维数组 2021.6.8 Arrays类 2021.6.9稀疏数组(复习) 总结 什么是方法? System.out.println(),那么它是什么呢?系统类里的,对象out,输出方法println Java

  • DWR中各种java方法的调用

    DWR是一个框架,简单的说就是能够在javascript直接调用java方法,而不必去写一大堆的javascript代码.它的实现是基于ajax的,可以实现无刷新效果. 网上有不少DWR的例子,但大都只是某种方法的调用,本文只在使用层面上介绍DWR,并不涉更多的技术与设计,其目的是让初学者能够很快的学会各种java方法在javascript中是如何调用的. 一.dwr配置篇之web.xml 1.最小配 <servlet> <servlet-name>dwr-invoker</

  • Java 使用反射调用jar包中的类方式

    下面讲展示的是从image.jar包中调用image.Buddy类的方法. public class Main { public static void main(String[] args) { try { // 两种方式都可以 URL url = new File("/Users/wuchen/Documents/IntelliJIDEA/Applet/out/production/Applet/image.jar").toURI().toURL(); // URL url = n

  • 简单了解JAVA内存区域效果知识

    这篇文章主要介绍了简单了解JAVA内存区域效果知识,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 JAVA内存区域介绍 程序计数器: 线程私有,很小的内存空间,可以看做是当前线程所执行的字节码的行号指示器: 每个线程都有一个独立的程序计数器,各个线程之间的计数器相互不影响,独立存储: 如果线程执行的是Java 方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址,如果是一个Native方法,那么这个计数器的值则为undefined: 该内存

  • 通过面试题解析 Java 类加载机制

    在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题: class Grandpa { static { System.out.println("爷爷在静态代码块"); } } class Father extends Grandpa { static { System.out.println("爸爸在静态代码块"); } public static int factor = 25; public Father() { System.ou

  • Inline Hook(ring3)的简单C++实现方法

    C++的Inline Hook代码,采用了备份dll的方法,因此在自定义的函数中可以直接调用在内存中备份的dll代码,而不需要把函数头部改来改去.用SetWindowsHookEx程序的稳定性应该会增加许多. 需要注意的是,例子中没有把原函数的头部几个字节改回去是因为,程序很简单,仅仅测试了效果后便可以退出,没有其他的功能.实际应用中,还要在你注入的dll模块卸载时,把原函数的头几个字节改回去,以免影响到程序继续运行的稳定性.(因为注入的程序不是自己的,我们当然不可能知道它到底在何时.有多少个我

随机推荐