简单解析java方法在调用在内存中的执行过程
作者:SSS4362 发布时间:2022-04-12 15:46:26
标签:java,方法,调用,内存,执行,过程
一.前提
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.示例代码运行截图
来源:https://blog.csdn.net/SSS4362/article/details/125653426


猜你喜欢
- 项目中肯定会遇到需要用户自己绘制地形的需求,然后根据地形自动生成房间。下面说说我在绘制地形的实现方法。我们百度可以看到很多关于自己创建mes
- 本文研究的主要是ConcurrentMap.putIfAbsent(key,value)用法的相关内容,具体如下。业务上经常会遇到有这种场景
- 1、接口:接口与抽象类一样,也是表示某种规则,一旦使用了该规则,就必须实现相关的方法。对于C#语言而言,由于只能继承自一个父类,因此若有多个
- 前言前面介绍了APP顶部导航栏AppBar,今天来介绍下Flutter实现APP底部导航栏。我们以仿写微信的底部导航栏来举例说明。要实现类似
- 本文实例总结了C#遍历DataSet控件的方法。分享给大家供大家参考。具体方法如下:DataSet控件在.net主要是用来存储数据的,它更像
- 对于触摸屏,其原生的消息无非按下、抬起、移动这几种,我们只需要简单重载onTouch或者设置触摸 * setOnTouchListener即
- Spring课程工程构建 在IDEA 工作空间里面创建Spring文件夹。打开IDEA,file–>Open&am
- 前言jdk中提供了许多的并发工具类,大家可能比较熟悉的有CountDownLatch,主要用来阻塞一个线程运行,直到其他线程运行完毕。而jd
- Android 获取IP地址最近做项目,有一个需求是Android设备获取当前IP的功能,经过一番查询资料解决了,记录下实现方法。1.使用W
- Overview在今天的开发学习中,我遇到了一个需求是在App的flash页面添加bing每日一图。这些都简单,但是当我获取到了图片的Url
- 目录例子1:字符型变量例子2:数据类型转换例子3:使用异或对字符进行加密和解密例子4:短路逻辑或(||)和位运算(|)的区别例子5:用if语
- /// <summary> /// 计算本周起始日期(礼拜一的日期) /// </summary&
- file: BluetoothEventLoop.java GB/GB2/GB3: 1. import android.os.PowerMa
- 本文实例讲述了C#实现将记事本中的代码编译成可执行文件的方法,运行环境为VS2012,具体方法如下:1、在记事本中编写如下代码:using
- 在对类访问使用时,常用到的有访问类的成员、方法。实例化在对类进行访问时,需要将类进行实例化。并产生一个对象。可以使用关键字new来实现。由于
- Java虚拟机(JVM)是可运行Java代码的假想计算机。只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java
- 这个工具叫“InstallShield”,可以自己去网上下一个,有绿色版本 也有安装版的。 &
- 1.系统架构包括哪些形式?C/S架构B/S架构2.什么是C/S架构?说白了就是客户端/服务端,我们需要安装特定的客户端软卷,例如:QQ。C/
- Kotlin中StateFlow的使用StateFlow 是 Flow 的实现,是一个特殊的流,默认的 Flow 是冷流,而StateFlo
- 这里我们以拨打电话申请权限来写个小例子,也就是CALL_PHONE,因为拨打电话会涉及用户手机的资费问题,因而被列为了危险权限,在Andro