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

作者:SSS4362 时间:2022-04-12 15:46:26 

一.前提

1.栈的内存原理图

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

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方法里面的语句

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

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

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

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

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

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

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

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

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

4.示例代码运行截图

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

来源:https://blog.csdn.net/SSS4362/article/details/125653426

标签:java,方法,调用,内存,执行,过程
0
投稿

猜你喜欢

  • springcloud配置ssh的问题及解决方法

    2023-11-03 15:48:11
  • 解决Eclipse创建android项目无法正常预览布局文件问题的方法

    2023-07-31 09:51:12
  • 详解Java如何实现小顶堆和大顶堆

    2023-11-10 04:03:05
  • Java并发编程预防死锁过程详解

    2023-11-09 15:33:58
  • Java8中LocalDateTime与时间戳timestamp的互相转换

    2023-11-10 05:20:21
  • Flutter Widget开发之Focus组件图文详解

    2023-06-21 03:47:41
  • 基于SpringBoot核心原理(自动配置、事件驱动、Condition)

    2023-08-23 01:46:31
  • java使用IO流对数组排序实例讲解

    2023-09-04 02:24:19
  • Java编程中使用XFire框架调用WebService程序接口

    2023-11-06 20:16:33
  • Springboot2.x+ShardingSphere实现分库分表的示例代码

    2023-11-26 01:34:07
  • 详解Java中对象池的介绍与使用

    2023-07-25 13:13:48
  • SpringCloud URL重定向及转发代码实例

    2023-11-19 11:43:18
  • Java+MySQL实现学生信息管理系统源码

    2023-11-28 04:29:31
  • 轻松学习C#的方法

    2023-06-21 13:22:32
  • SpringBoot核心@SpringBootApplication使用介绍

    2023-11-25 08:33:59
  • Java中JDBC连接数据库详解

    2023-08-10 16:57:18
  • 一键清除maven仓库中下载失败的jar包的实现方法

    2023-08-13 03:43:59
  • C++ lambda函数详解

    2023-06-20 07:49:43
  • 深入了解JAVA HASHMAP的死循环

    2023-11-28 00:32:12
  • opencv 做人脸识别 opencv 人脸匹配分析

    2023-07-09 06:34:44
  • asp之家 软件编程 m.aspxhome.com